Ruby的动态Inject方法不起作用

时间:2015-12-09 05:49:23

标签: ruby

在检查注入方法的工作时,我写下了简单的代码来打印可以被3整除的数字计数,但不知何故发生了故障:

{{1}}

这是次要的,但我没有抓住它。

2 个答案:

答案 0 :(得分:3)

使用inject,您需要在每次迭代时返回memo-element:

[1, 2, 3, 4].inject(0) do |count, value|
  if value % 3 == 0
    count = count + 1
  end

  count
end
#=> 1

或者,如果您更喜欢单行版本:

[1, 2, 3, 4].inject(0) { |c, v| c += 1 if v % 3 == 0; c }
#=> 1

值得注意的是。在某些情况下,您可以将inject替换为each_with_object,并避免必须返回memo对象,但由于后者的返回值是传入的原始对象,因此它仅适用于传递的对象参考(即不是Fixnum s。)

[1, 2, 3, 4].each_with_object(0) { |v, c| c += 1 if v % 3 == 0 }
#=> 0

答案 1 :(得分:1)

事实证明它实际上是次要的。我没有在每个循环结束时返回计数,所以在第一次迭代后计数为零,因为我没有返回它。失误!

[1,2,3,4].inject(0) do |count,value|
   if value % 3 == 0
     count = count + 1
   end
count
end