5

为什么第二个不返回与第一个相同的值?

puts (3..5).map{|n| n**3}.inject{|sum,n| sum + n}
puts (3..5).inject{|sum,n| sum + n**3}

216 192

4

3 回答 3

9

因为在第一种情况下,累加器的起始值27,在第二种情况下是3

如果您将0其用作显式起始值,则两者都将评估为相同的数字:

(3..5).map {|n| n**3 }.inject(0) {|sum,n| sum + n }
# => 216
# or just
(3..5).map {|n| n**3 }.inject(0, :+)

(3..5).inject(0) {|sum,n| sum + n**3 }
# => 216
于 2013-08-06T11:55:23.503 回答
5

Enumerable#inject说:

如果您指定一个块,那么对于枚举中的每个元素,该块都会传递一个累加器值(备忘录)和元素。如果你指定了一个符号,那么集合中的每个元素都将被传递给 memo 的命名方法。无论哪种情况,结果都会成为 memo 的新值。在迭代结束时,memo 的最终值就是方法的返回值。

如果没有显式指定 memo 的初始值,则 collection 的第一个元素用作 memo 的初始值。

以下将起作用:

puts (3..5).inject(0){|sum,n| sum + n**3}
于 2013-08-06T11:56:00.727 回答
1

检查以下

1.9.3p327 :084 > (3..5).inject{|sum,n| puts sum;puts n;sum + n**3}
3
4
67
5
 => 192 

所以这里的最终答案将是67+125=192

1.9.3p327 :085 > (3..5).map{|n| n**3}.inject{|sum,n| puts sum;puts n;sum + n}
27
64
91
125
 => 216 

这里的最终答案将是91+125=216

于 2013-08-06T11:57:13.290 回答