Ruby注入功能

时间:2013-08-06 11:49:37

标签: ruby

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

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

216 192

3 个答案:

答案 0 :(得分:9)

因为在第一种情况下the starting value of the accumulator27,在第二种情况下是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

答案 1 :(得分:5)

Enumerable#inject说:

  

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

     

如果您没有明确指定备忘录的初始值,那么集合的第一个元素将用作备忘录的初始值。

以下内容可行:

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

答案 2 :(得分: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