Crystal .cycle 循环结束后回收

Crystal .cycle Recycle after finish looping

所以就我而言

def dynamic_data()
  data = [] of String
  # some data from db
  # data << db["somekey"].to_s
  return data
end

dynamic_data().cycle do |d|
  # some stuff
  puts d
end

我的数据达到500多行,还会继续增长和增加,如何先循环结束循环,然后从函数重新加载新数据,或者有其他方法吗? , 谢谢

how to make cycle finishing loop first

没有办法让 Array#cycle 完成,因为它明确设计为永远 运行(除非调用 break,但这不太可能是你要找的) .

如果我正确理解了您的意图,那么您正在尝试处理传入的数据部分。为此,需要更复杂的处理,例如:

class DataHandler
  def initialize
    @data = []
  end
  def data()
    @data.tap(&:clear)
  end
  def data!(new_data)
    @data << new_data
  end
end

data_handler = DataHandler.new

loop do
  break "empty data" if data_handler.data.empty?
  puts data_handler.data
end

或者,正如 Jonne Haß 在评论中指出的那样,使用 yield:

def dynamic_data()
  data = []
  loop do
    data << new_data
    yield data.tap(&:clear) if data.size > 100
  end
end

dynamic_data do
  puts d
end