Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么存储中间值会破坏我对Ruby的使用;什么是注射法?_Ruby - Fatal编程技术网

为什么存储中间值会破坏我对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