ruby.地图!或每个用于就地修改数组

ruby .map! or each for modifying an array in place

我有以下内容:

article_results.keys do |key|
  article_results[key].map! do |a|
    a[:filename] = c.filename
    a[:sitename] = c.site_name
    a
  end
end

因为我想动态地添加到散列中的每个数组的每个元素,但是由于某些原因a[:filename]a[:sitename]在使用时是空白的。

所以我想知道我是否应该改用 .each。 另外我想我想知道主要区别是什么,因为它们都可以用于副作用。

我添加这个作为额外的参考信息,我使用的是 ruby 1.8.7,所以很高兴知道版本 (1.8.7 - 1.9+) 之间的区别。

P.s。我知道 .each.map 之间的区别是什么,我专门问 .map!.

#map 的散列语义与数组的语义略有不同(我认为 ruby 的版本之间不是很一致)。一般来说,如果你正在寻找一个数组作为一些操作的结果 - #map 是你的朋友,但是如果你想要散列作为一些操作的结果 - 你最好使用 #reduce:

article_results.reduce({}) do |hash, (key, value)|
  hash.merge(key => value.merge(filename: c.filename,
                                sitename: c.sitename))
end

或者,如果您不关心 "functional" 您的代码如何,您可以使用 #each:

article_results.each do |key, value|
  article_results[key].merge!(filename: c.filename,
                              sitename: c.sitename)
end