2012-03-06 173 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