在哈希的键数组中追加元素

时间:2012-03-06 19:50:34

标签: ruby arrays hashtable

请参阅我的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]}

为什么附加了第二个哈希元素(数组)?

如何使用新数组元素仅附加第3个哈希的元素?

2 个答案:

答案 0 :(得分: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}

但是,正如我们在上面看到的那样,获取值,但它不是 set 作为该缺失键的值。如上所述,您需要硬设置值。通常,你想要的是将价值神奇地变为生命的价值:

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

答案 1 :(得分:0)

如果你打算对Hash使用数字索引,为什么不直接使用数组呢?

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

要获得所需的输出:

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