2017-08-29 22 views
1

后水晶.cycle回收完成所以在我的情况下,循环

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多行,将继续增长和提高,如何使循环整理循环第一,然后再从加载新数据功能,还是有其他方法?感谢

回答

1

如何使cycle加工循环第一

有没有办法让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 HASS评论中指出,使用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 
+0

',因为它是被设计为运行永远',,首先完成你的工作(循环),然后再次回收,那就是我的意思 – jihantoro

+0

更习惯的方式是将循环放入数据获取方法,并让它使用'yield '。 –

+0

@JonneHaß冻结数据获取如果'yield'花费太长时间?听起来像你从来没有处理背压。 – mudasobwa

相关问题