为什么存储中间值会破坏我对Ruby的使用;什么是注射法?
我想使用为什么存储中间值会破坏我对Ruby的使用;什么是注射法?,ruby,Ruby,我想使用inject并将中间值存储在数组中。代码如下: store_value = [] [1,2,3].inject(0) do |sum, n| store_value << sum + n end 我不明白为什么。为什么这不起作用?传递到inject的块需要返回备忘录(在您的情况下是sum)。追加到数组将返回数组,而不是追加的值。因此,在您的代码中,第一次执行块时,sum变为[1],第二次执行块时,sum+n变为[1]+2,这会给出您看到的错误 通过从块中返回总和来修复它
inject
并将中间值存储在数组中。代码如下:
store_value = []
[1,2,3].inject(0) do |sum, n|
store_value << sum + n
end
我不明白为什么。为什么这不起作用?传递到
inject
的块需要返回备忘录(在您的情况下是sum)。追加到数组将返回数组,而不是追加的值。因此,在您的代码中,第一次执行块时,sum
变为[1],第二次执行块时,sum+n
变为[1]+2
,这会给出您看到的错误
通过从块中返回总和来修复它:
store_value = []
[1,2,3].inject(0) do |sum, n|
sum += n
store_value << sum
sum
end
传递到
inject
的块需要返回备忘录(在您的情况下是sum)。追加到数组将返回数组,而不是追加的值。因此,在您的代码中,第一次执行块时,sum
变为[1],第二次执行块时,sum+n
变为[1]+2
,这会给出您看到的错误
通过从块中返回总和来修复它:
store_value = []
[1,2,3].inject(0) do |sum, n|
sum += n
store_value << sum
sum
end
尝试只添加
sum
?@sagarpandya2。最简单的修复方法是返回sum+n
,而不是sum
。这有点重复,因此我的答案是。顺便说一句:这个操作叫做扫描或前缀和,可以在Haskell和Scala的标准库中找到,但不幸的是在Ruby中找不到。另请参见:尝试只添加sum
?@sagarpandya82。最简单的修复方法是返回sum+n
,而不是sum
。这有点重复,因此我的答案是这样的。顺便说一句:此操作称为扫描或前缀和,可以在Haskell和Scala的标准库中使用,但不幸的是在Ruby中没有。另请参见:另一个选项是将数组设为累加器:[1,2,3]。inject([0]){| prefix,n | prefix另一个选项是使数组成为累加器:[1,2,3].inject([0]){| prefix,n | prefix
store_value = []
[1,2,3].inject(0) do |sum, n|
(sum + n).tap { |new_sum| store_value << new_sum }
end