为什么在0
中使用each_with_object
作为参数不会返回正确的值:
[1,2,3].each_with_object(0) {|i,o| o += i }
# => 0
但是使用空数组而reduce(:+)
呢?
[1,2,3].each_with_object([]) {|i,o| o << i }.reduce(:+)
# => 6
答案 0 :(得分:3)
来自documentation它说:
each_with_object(obj) → an_enumerator
Iterates the given block for each element with an arbitrary object given, and returns the initially given object.
If no block is given, returns an enumerator.
由于Array是一个相同的初始对象,但在这种情况下返回修改后的值。
如果我们看到each_with_object的code,那就是:
# File activesupport/lib/active_support/core_ext/enumerable.rb, line 79
def each_with_object(memo)
return to_enum :each_with_object, memo unless block_given?
each do |element|
yield element, memo
end
memo
end
你可以看到,它不会修改备忘录,所以如果备忘录是0
而你在代码块中更改它,它仍将返回零,但如果你通过[]
并更改它在代码块内部,它将返回带有值的数组。
答案 1 :(得分:3)
您的示例中没有Ruby错误,这意味着它们都是正确的。
在第一个示例中,参数0
是返回值。在第二个示例中,参数(最初看起来是[]
)是返回值。只有在后者中,论证才被修改,最终看起来与开头的样子不同,但保留了对象的身份。