在哈希的键数组中追加元素
Posted
技术标签:
【中文标题】在哈希的键数组中追加元素【英文标题】:Append element in hash's key-array 【发布时间】:2012-03-24 08:24:43 【问题描述】:查看我的 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]
为什么要附加第二个哈希元素(数组)?
如何仅将第三个哈希的元素附加到新的数组元素?
【问题讨论】:
Modifying the default hash value 的可能重复项 我无法想出任何合理的方案,只要你想要的东西是有意义的。为什么你期望h[2]
与h[1]
具有相同的值。
糟糕,抱歉,我已经编辑了我的预期结果。不过我已经接受了答案。
@MichaelZ 好的,太好了;我将从我的答案中删除令人困惑的编辑。
【参考方案1】:
如果您将单个值作为参数提供给 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
但是,正如我们在上面看到的那样,get 值,但它不是 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
【讨论】:
哇!谢谢!你让我大开眼界!【参考方案2】:如果要使用数字索引作为哈希值,为什么不直接使用数组呢?
h = []
h<<:word1
h<<:word2
h<<:word3
print h
为了达到你想要的输出:
h = []
h<<:word1
h<<:word2
h<<[]
h[2]<<h[1]<<:word3
print h
【讨论】:
以上是关于在哈希的键数组中追加元素的主要内容,如果未能解决你的问题,请参考以下文章