【发布时间】:2015-07-02 19:11:08
【问题描述】:
我正在尝试修改数组的副本而不更改原始数组。这是一个哈希数组,所以要制作我使用的数组的“全新”副本:
foo = [ { :a => "aaaaaa" } ]
foocopy = foo.map { |h| h.dup }
我想将一些数据附加到副本中哈希中的字符串。
如果我使用= 和+ 效果很好:
foocopy.first[:a] = foocopy.first[:a] + "bbbbb"
foo
=> [{:a=>"aaaaaa"}] # original unchanged as expected
foocopy
=> [{:a=>"aaaaaabbbbb"}]
但是,如果我使用<<,它会同时修改副本和原件:
foocopy.first[:a] << "cccccc"
foo
=> [{:a=>"aaaaaacccccc"}] # ORIGINAL got changed too
foocopy
=> [{:a=>"aaaaaacccccc"}]
这是 Ruby 中的错误吗?
【问题讨论】:
-
在使用数组时,您非常不太可能在
<<和+这样的老牌事物中发现错误。 -
然而……它发生了……stackoverflow.com/questions/29224421/… 据任何人称,这似乎是一个持续到 4 的 rails 错误。在这种情况下,由于特殊情况(修改复制数组内的哈希内的字符串)这似乎是一个错误。但是@jorge 给出的解释很有启发性。我的观点是,虽然不太可能,但这并非不可能,AFAIK SO 是一个很好的询问和发现的地方。
-
Rails 与 Ruby 几乎不是同一层,
<<和+的使用次数超过了 Rails 方法 any Rails 方法的使用次数。因此,在 Rails 中发现 bug 比在 Ruby 中发现核心方法的可能性要大得多。