【发布时间】:2019-07-30 10:44:23
【问题描述】:
根据所有文档,您可以使用<< 或.push 或+= 将元素附加到数组,结果应该是相同的。我发现不是。谁能向我解释我做错了什么? (我使用的是 Ruby 2.3.1。)
我有许多哈希值。它们都包含相同的键。我想将它们组合成一个散列,其中包含一个数组中的所有收集值。这很简单,您遍历所有散列并创建一个新散列,收集所有值,如下所示:
# arg is array of Hashes - keys must be identical
return {} unless arg
keys = (arg[0] ? arg[0].keys : [])
result = keys.product([[]]).to_h # value for each key is empty array.
arg.each do |h|
h.each { |k,v| result[k] += [v] }
end
result
end
如果而不是使用+= 我使用.push 或<<,我会得到完全奇怪的结果。
使用以下测试数组:
a_of_h = [{"1"=>10, "2"=>10, "3"=>10, "4"=>10, "5"=>10, "6"=>10, "7"=>10, "8"=>10, "9"=>10, "10"=>10}, {"1"=>100, "2"=>100, "3"=>100, "4"=>100, "5"=>100, "6"=>100, "7"=>100, "8"=>100, "9"=>100, "10"=>100}, {"1"=>1000, "2"=>1000, "3"=>1000, "4"=>1000, "5"=>1000, "6"=>1000, "7"=>1000, "8"=>1000, "9"=>1000, "10"=>1000}, {"1"=>10000, "2"=>10000, "3"=>10000, "4"=>10000, "5"=>10000, "6"=>10000, "7"=>10000, "8"=>10000, "9"=>10000, "10"=>10000}]
我明白了
merge_hashes(a_of_h)
=> {"1"=>[10, 100, 1000, 10000], "2"=>[10, 100, 1000, 10000], "3"=>[10, 100, 1000, 10000], "4"=>[10, 100, 1000, 10000], "5"=>[10, 100, 1000, 10000], "6"=>[10, 100, 1000, 10000], "7"=>[10, 100, 1000, 10000], "8"=>[10, 100, 1000, 10000], "9"=>[10, 100, 1000, 10000], "10"=>[10, 100, 1000, 10000]}
正如我所料,但如果我改用h.each { |k,v| result[k] << v },我会得到
buggy_merge_hashes(a_of_h)
=> {"1"=>[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000], "2"=>[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000], "3"=>[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000], "4"=>[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000], "5"=>[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000], ...}
(我把剩下的剪掉了。)
这里有什么我不知道的?
【问题讨论】:
-
"根据所有文档,您可以使用
<<或.push或+=将元素附加到数组,结果应该相同 。” ——请告诉我们你在哪里找到了这个“所有文件”,这样我们就可以带着极端的偏见将它从这个宇宙中根除,因为它完全是错误的。正如你所发现的,很明显是这样。另外,请使用官方文档,它非常清楚地没有说明您声称“所有文档”状态。 -
@Jörg W Mittag:在这里,例如:teamtreehouse.com/library/adding-items-to-arrays-2。或在这里:ruby-forum.com/t/add-element-at-end-of-array/106609。只是一个开始。
-
...坦率地说,我仍然不明白为什么这是完全错误的;所有三个方法都修改数组并在末尾附加新元素。正如 Amadan 写得如此优美,我的错误完全在别处。
-
是和不是。
array += element不 修改数组。它创建一个新数组,然后丢弃旧数组。想象一下,如果您的冰箱里需要更多啤酒。你可以买更多的啤酒,然后把它放进冰箱(fridge << beer,fridge.push(beer)),或者你可以买一个新冰箱,把旧冰箱里的所有东西和你买的啤酒一起移到新冰箱,然后扔掉旧冰箱走了(fridge = fridge + beer,fridge += beer)。 -
我想指出您提供的两个链接都不是文档。第二个只是邮件列表上一群随机人之间的讨论,第一个是互联网上某个随机人的课程。此外,第二个链接中的 nowhere 有人声称这三个表达式是等价的,实际上
+=甚至没有被提及一次。我无法评论第一个链接,因为它需要我付费才能观看视频。但是,如果视频没有解释突变和重新绑定之间的区别,我会要求您退款。