我通常使用loop如下方式从外部API或DB(redis pop)请求数据:
records = []
loop do
record = MyHandler.new(token).fetch
break unless record
records.push(record)
end
Run Code Online (Sandbox Code Playgroud)
它有效,但为了让它看起来更好,我想知道是否有任何方法可以使用Enumerator.有人知道吗?
将代码包装在一起Enumerator非常简单:
record_enumerator = Enumerator.new do |y|
loop do
record = MyHandler.new(token).fetch
break unless record
y << record
end
end
Run Code Online (Sandbox Code Playgroud)
您现在可以使用块迭代记录:
record_enumerator.each { |record|
# do something with record
}
Run Code Online (Sandbox Code Playgroud)
或者获取所有记录:
records = record_enumerator.to_a
Run Code Online (Sandbox Code Playgroud)
如果MyHandler是你的班级,你可以MyHandler#each改为实施并包括Enumerable.