请参阅我的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个哈希的元素?
答案 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