"break" 与 "raise StopIteration" 在 Ruby 枚举器中

"break" vs "raise StopIteration" in a Ruby Enumerator

如果我使用 Ruby 枚举器来实现生成器和过滤器:

generator = Enumerator.new do |y|
  x = 0
  loop do
    y << x
    x += 1
    break if x > CUTOFF
  end
end.lazy

filter = Enumerator.new do |y|
  loop do
    i = generator.next
    y << i if i.even?
  end
end

是否使用

跳出生成器的循环有什么不同吗
break if x > CUTOFF

raise StopIteration if x > CUTOFF

?

两者似乎都有效。我想 break 会更高效,但是 raise 在这里更惯用吗?

在 Ruby 中 considered a bad practice 使用 raise/fail 控制流程,因为它们真的很慢。

所以回答你的问题 raise StopIteration if x > CUTOFF 并不是打破循环的惯用方式