为什么存储中间数总和会破坏我对Ruby注入方法的使用?

时间:2016-06-13 15:34:42

标签: ruby

我想使用inject并将中间值存储在数组中。这是代码:

store_value = []
[1,2,3].inject(0) do |sum, n|
  store_value << sum + n
end

我收到此错误:

no implicit conversion of Fixnum into Array (TypeError)

我不明白为什么。为什么这不起作用?

1 个答案:

答案 0 :(得分:3)

传递给inject的块需要返回备忘录(在您的情况下为总和)。附加到数组将返回数组,而不是附加的值。因此,在您的代码中,第一次执行块sum变为[1],第二次执行sum + n[1] + 2,这会给您错误你看。

通过从块中返回总和来修复它:

store_value = []
[1,2,3].inject(0) do |sum, n|
  sum += n
  store_value << sum
  sum
end

或者使用tap来阻止追加:

store_value = []
[1,2,3].inject(0) do |sum, n|
  (sum + n).tap { |new_sum| store_value << new_sum }
end