有一个警察:RuboCop::Cop::Lint::NextWithoutAccumulator
.
谁能解释一下这个 cop 是做什么用的,它应该如何以什么方式改进代码?
它是否提高了可读性和效率?
最佳答案
让我们考虑文档中的示例代码:
# bad
result = (1..4).reduce(0) do |acc, i|
next if i.odd?
acc + i
end
如果您在控制台中尝试此操作,您将获得 nil
对象的 NoMethodError
异常。这是因为如果没有指定对象,next
将“返回”nil
。您可以将其视为迭代器的 return
。
对于 reduce
method它可能会导致一些意想不到的行为,因为它需要 block 返回的一些值。如果 i
是奇数,则对 next
求值,而 block 给出 nil
作为结果。在下面的迭代器中 acc
等于 nil
并且它不能向它添加整数。在我们的示例中,第一次迭代是针对 i = 1
,next
将 acc
设置为 nil
作为 block 。
在某些情况下,您可以获得可枚举的正确值,但通常在内部为 next
指定值会更安全。
关于ruby - 在 `next` 中使用带有累加器参数的 `reduce`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39551400/