为什么数组#each_with_object(0)不起作用?

时间:2015-03-23 12:34:36

标签: ruby

为什么在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

2 个答案:

答案 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是返回值。在第二个示例中,参数(最初看起来是[])是返回值。只有在后者中,论证才被修改,最终看起来与开头的样子不同,但保留了对象的身份。