有一个警察:RuboCop::Cop::Lint::NextWithoutAccumulator
。在`reduce`中使用累加器自变量的`next`
是否有人能够解释这个警察是什么,它应该如何改善代码以什么方式?
它提高了可读性,效率吗?
有一个警察:RuboCop::Cop::Lint::NextWithoutAccumulator
。在`reduce`中使用累加器自变量的`next`
是否有人能够解释这个警察是什么,它应该如何改善代码以什么方式?
它提高了可读性,效率吗?
让从文档中考虑的示例代码:
# bad
result = (1..4).reduce(0) do |acc, i|
next if i.odd?
acc + i
end
如果你尝试这种在控制台,你会得到NoMethodError
例外的nil
对象。这是因为如果没有指定对象,next
“返回”nil
。对于迭代器,您可以将其视为return
。
对于reduce
method它可能会导致一些意外的行为,因为它需要块返回一些值。如果i
是奇数,则对next
进行评估,并将块作为结果给出nil
。在下面的迭代器中,acc
等于nil
,它不能为其添加整数。在我们的例子中,作为块的结果,第一次迭代是i = 1
,next
集合acc
到nil
。
在某些情况下,您可以为enumerable获得正确的值,但通常在里面指定next
的值会更安全。
感谢您的详细的答案! –
这并不回答这个问题,但问题可能是失去(无题,需要意见)。 –
您是否试图运行链接到的警察文档中的两个示例? –
@ muistooshort耻辱对我 - 我没有:(我希望傍晚放弃这个草率的问题至少有点.. –