each_with_object 不适用于整数等不可变对象。
(1..3).each_with_object(0) {|i,sum| sum += i} #=> 0
这是因为each_with_object 遍历集合,将每个元素和给定对象传递给块。它不会在每次迭代后更新 object 的值,而是返回原始给定的 object。
它适用于散列,因为更改散列键的值会自行更改原始对象的值。
(1..3).each_with_object({:sum => 0}) {|i,hsh| hsh[:sum] += i}
#=> {:sum => 6}
String 对象是有趣的案例。它们是可变的,因此您可能会期望以下
返回“abc”
("a".."c").each_with_object("") {|i,str| str += i} # => ""
但事实并非如此。这是因为str += "a" 返回一个新对象而原始对象保持不变。但是,如果我们这样做
("a".."c").each_with_object("") {|i,str| str << i} # => "abc"
之所以有效,是因为str << "a" 修改了原始对象。
有关更多信息,请参阅each_with_object 的 ruby 文档
为了您的目的,请使用inject
(1..3).inject(0) {|sum,i| sum += i} #=> 6
# or
(1..3).inject(:+) #=> 6