【发布时间】:2016-12-15 20:44:52
【问题描述】:
如果我使用 Ruby Enumerators 来实现生成器和过滤器:
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 在这里更惯用吗?
【问题讨论】:
-
因为您正在使用
lazy,所以我个人会选择raise StopIteration。 -
这似乎是一种使用 ruby 的非常 Python 的方式。根据您要完成的工作,可能有更好的方法来实现它
-
@Zack 该示例并不能很好地代表我的真实用例——只是一个过于简单的示例来演示我遇到的问题。真正的生成器进行一系列 api 调用,分批获取记录,每次生成一条记录,直到需要获取另一批记录。这一切都包含在另一个 Enumerator 中,该 Enumerator 过滤掉与调用代码相关的记录。
标签: ruby enumerator