2017-07-06 25 views
1

我試圖通過向值數組中添加元素來返回散列,其中的鍵是字符串,值是數組,例如:紅寶石:如何在返回散列時擦除字符串中的「

{"Fixnum"=>[1, 8], "Hash"=>[{7=>"einzeln", 5=>[13]}]} 

但我要刪除「的按鍵,就像這樣:

{Fixnum=>[1, 8], Hash=>[{7=>"einzeln", 5=>[13]}]} 

很明顯,我不能簡單地用.delete('」'),因爲那麼「與einzeln會也走了。我也試過在將元素添加到值數組中時凍結元素的.to_s形式,然後使用.delete,但它不起作用。我也沒有找到迭代或獲取密鑰,並直接在密鑰上使用.delete,因爲密鑰被凍結。

有沒有辦法做到這一點?

+0

你從哪裏得到鑰匙?他們總是會成爲紅寶石課程嗎?你爲什麼要把你的密鑰從字符串轉換成類型? –

+0

它的目的是什麼? –

回答

2

混雜鍵實際上沒有雙引號("),你看到他們,因爲鍵是字符串和紅寶石將顯示所有串封閉雙引號之間;所以你將無法(也不需要)刪除它們。

你可以做的是使用的哈希鍵符號代替(這是相當多的Ruby最佳實踐)。

對於您既可以創建符號散,像這樣:

my_hash = {Fixnum: [1, 8], Hash: [{7=>"einzeln", 5=>[13]}]} 
#=> {:Fixnum=>[1, 8], :Hash=>[{7=>"einzeln", 5=>[13]}]} 

如果你有在哈希鍵無法控制,你可以將鑰匙轉換爲符號,像這樣的:

my_hash = {"Fixnum"=>[1, 8], "Hash"=>[{7=>"einzeln", 5=>[13]}]} 

Hash[my_hash.map{ |k, v| [k.to_sym, v] }] 
#=> {:Fixnum=>[1, 8], :Hash=>[{7=>"einzeln", 5=>[13]}]} 

或者,如pointed out by mu is too short,你可以使用FixnumHash類鑰匙,就像這樣:

my_hash = {Fixnum => [1, 8], Hash => [{7=>"einzeln", 5=>[13]}]} 
#=> {Fixnum=>[1, 8], Hash=>[{7=>"einzeln", 5=>[13]}]} 

同樣,如果你沒有在哈希鍵控制,可以按鍵轉換爲自己的班級,這樣:

my_hash = {"Fixnum"=>[1, 8], "Hash"=>[{7=>"einzeln", 5=>[13]}]} 

Hash[my_hash.map{ |k, v| [eval(k.to_s), v] }] 
#=> {Fixnum=>[1, 8], Hash=>[{7=>"einzeln", 5=>[13]}]} 

保持請記住,只有在完全信任/控制傳遞給它的值時,才推薦使用eval

+1

爲什麼不使用類本身作爲關鍵? '{Fixnum => [1,8],Hash => [{7 =>「einzeln」,5 => [13]}]}'是一個非常好的散列。 –

+0

@ muistooshort哦,你是對的!這從來沒有超過我的想法。謝謝你指出。 – Gerry

+0

@ muistooshort謝謝。這是一個好主意 – TriPham259