ruby - 在 `next` 中使用带有累加器参数的 `reduce`

标签 ruby coding-style rubocop

有一个警察:RuboCop::Cop::Lint::NextWithoutAccumulator .

谁能解释一下这个 cop 是做什么用的,它应该如何以什么方式改进代码?

它是否提高了可读性和效率?

github code .

最佳答案

让我们考虑文档中的示例代码:

# 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 = 1nextacc 设置为 nil 作为 block 。

在某些情况下,您可以获得可枚举的正确值,但通常在内部为 next 指定值会更安全。

关于ruby - 在 `next` 中使用带有累加器参数的 `reduce`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39551400/

相关文章:

javascript - Rails `link_to` 方法多次发布

ruby - 如何创建和使用多态关系?

ruby-on-rails - Heroku 错误 H13

c# - 在 C# 中声明 const 的更优雅的方法是什么

Java 代码风格——接口(interface)与抽象类

ruby - Rubocop 警告 : Style/EndOfLine has the wrong namespace

ruby-on-rails - 禁用关于方法的 Rubocop 投诉

ruby-on-rails - Rails 服务器未以 Debug模式启动,说我需要设置弃用

ios - 具有 "More"按钮样式的 UIBarButtonItem

ruby - 如何修复 a::b::c 类的 rubocop 攻击