【问题标题】:Use `next` with an accumulator argument in a `reduce`在 `reduce` 中使用 `next` 和累加器参数
【发布时间】:2016-09-17 20:27:47
【问题描述】:

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

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

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

github code.

【问题讨论】:

  • 您是否尝试运行您链接到的警察文档中的两个示例?
  • @muistooshort 让我感到羞耻 - 我没有 :( 我希望深夜至少能稍微解决这个仓促的问题..

标签: ruby coding-style rubocop


【解决方案1】:

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

# 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 = 1nextacc 设置为 nil 作为块的结果。

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

【讨论】:

  • 这不回答问题,但问题可能超出范围(作为题外话,需要意见)。
  • 检查@gregory-ray 响应以获取解决方法代码示例
【解决方案2】:

不好

result = (1..4).reduce(0) do |acc, i|
  next if i.odd?
  acc + i
end

result = (1..4).reduce(0) do |acc, i|
  next acc if i.odd?
  acc + i
end

正如@smefju 所指出的,next 本身隐式返回nil,并且在作为下一次执行块的参数传入时会导致NoMethodError

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多