2017-08-29 66 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

相關問題