Ruby注入功能

Jef*_*eff 5 ruby

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

puts (3..5).map{|n| n**3}.inject{|sum,n| sum + n}
puts (3..5).inject{|sum,n| sum + n**3}
Run Code Online (Sandbox Code Playgroud)

216 192

Jör*_*tag 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
Run Code Online (Sandbox Code Playgroud)

  • 请添加对doc http://ruby-doc.org/core-2.0/Enumerable.html#method-i-inject的引用:`如果没有为memo显式指定初始值,则使用集合的第一个元素作为备忘录的初始值 (3认同)
  • @ŁukaszNiemier:为什么?当然,这是一个不必要的特殊情况,可能不应该首先添加到API中,但是,嘿,它就在那里,为什么不使用它呢? (3认同)

Aru*_*hit 5

Enumerable#inject 说:

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

如果没有为memo显式指定初始值,那么集合的第一个元素将用作memo的初始值.

以下将工作:

puts (3..5).inject(0){|sum,n| sum + n**3}
Run Code Online (Sandbox Code Playgroud)