"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
并不是打破循环的惯用方式
如果我使用 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
并不是打破循环的惯用方式