2012-03-06 102 views
5

見我的Ruby代碼:附加元素

h=Hash.new([]) 
h[0]=:word1  
h[1]=h[1]<<:word2 
h[2]=h[2]<<:word3 
print "\nHash = " 
print h 

輸出是:

Hash = {0=>:word1, 1=>[:word2, :word3], 2=>[:word2, :word3]} 

我預計將有

Hash = {0=>:word1, 1=>[:word2], 2=>[:word3]} 

爲什麼第二哈希元素(數組)被追加?

我該如何將新的數組元素添加到第三個哈希元素?

+0

可能重複[修改默認的散列值(http://stackoverflow.com/questions/9492889/modifying-the-default-hash-價值) – 2012-03-06 20:16:06

+0

我有麻煩提出任何合理的情況下,你想要什麼是合理的。你爲什麼期望'h [2]'具有與'h [1]'相同的值。 – Phrogz 2012-03-06 20:16:21

+0

哎呀,對不起,我編輯了我的預期結果。不過,我已經接受了答案。 – 2012-03-06 20:22:25

回答

9

如果您提供一個值作爲參數傳遞給Hash.new(如Hash.new([])完全相同的對象用作每個失蹤鍵的默認值。這就是你所得到的,這是你不想要的東西。

你也可以使用Hash.new,其中塊是每個丟失鑰匙被請求時調用塊形式:

irb(main):001:0> h = Hash.new{ [] } 
#=> {} 
irb(main):002:0> h[0] = :foo 
#=> :foo 
irb(main):003:0> h[1] << :bar 
#=> [:bar] 
irb(main):004:0> h 
#=> {0=>:foo} 

然而,正如我們上面看到你得到日e值,但它不是設置爲缺少密鑰的值。正如你在上面所做的那樣,你需要硬性設定值。通常情況下,你想,而不是什麼是價值神奇春天到生活作爲鍵的值:

irb(main):005:0> h = Hash.new{ |h,k| h[k] = [] } 
#=> {} 
irb(main):006:0> h[0] = :foo 
#=> :foo 
irb(main):007:0> h[1] << :bar 
#=> [:bar] 
irb(main):008:0> h 
#=> {0=>:foo, 1=>[:bar]} 

現在,我們不僅得到了全新的數組回來時,我們要求缺失的關鍵,但這自動填充我們的哈希與數組,以便您不需要做h[1] = h[1] << :bar

+0

哇!謝謝!你睜開眼睛! – 2012-03-06 20:20:08

0

爲什麼不直接使用數組呢?如果您打算爲哈希使用數字索引呢?

h = [] 
h<<:word1 
h<<:word2 
h<<:word3 
print h 

爲了達到所需輸出:的

h = [] 
h<<:word1 
h<<:word2 
h<<[] 
h[2]<<h[1]<<:word3 
print h