我在想each_with_object
应该怎么用.
我举了一个不起作用的例子:
> (1..3).each_with_object(0) {|i,sum| sum+=i}
=> 0
我假设结果是6!我的错在哪里?
我在想each_with_object
应该怎么用.
我举了一个不起作用的例子:
> (1..3).each_with_object(0) {|i,sum| sum+=i}
=> 0
我假设结果是6!我的错在哪里?
each_with_object
不适用于integer等不可变对象.
(1..3).each_with_object(0) {|i,sum| sum += i} #=> 0
这是因为each_with_object
迭代一个集合,将每个元素和给定对象传递给块.它不会在每次迭代后更新object的值,并返回原始的给定对象.
它将与哈希一起工作,因为更改哈希键的值会自动更改原始对象的哈希值.
(1..3).each_with_object({:sum => 0}) {|i,hsh| hsh[:sum] += i}
#=> {:sum => 6}
String
件物品是一个有趣的例子.它们是可变的,因此您可能会想到以下几点
("a".."c").each_with_object("") {|i,str| str += i} # => ""
但事实并非如此.这是因为str += "a"
返回一个新对象,而原始对象保持不变.然而,如果我们
("a".."c").each_with_object("") {|i,str| str << i} # => "abc"
它之所以有效,是因为str << "a"
修改了原始对象.
有关更多信息,请参阅ruby docs For each_with_object
为了你的目的,使用inject
(1..3).inject(0) {|sum,i| sum += i} #=> 6
# or
(1..3).inject(:+) #=> 6