【发布时间】:2016-09-17 20:27:47
【问题描述】:
【问题讨论】:
-
您是否尝试运行您链接到的警察文档中的两个示例?
-
@muistooshort 让我感到羞耻 - 我没有 :( 我希望深夜至少能稍微解决这个仓促的问题..
标签: ruby coding-style rubocop
【问题讨论】:
标签: ruby coding-style rubocop
让我们考虑文档中的示例代码:
# 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 作为块的结果。
在某些情况下,您可以获得可枚举的正确值,但通常在内部为 next 指定值更安全。
【讨论】:
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。
【讨论】: