使用枚举器而不是循环

Leo*_*nko 0 ruby enumerator

我通常使用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.有人知道吗?

Ste*_*fan 5

将代码包装在一起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.

  • 自定义`Enumerator`类可以帮助您清理代码.这是一个很好的例子. (2认同)