2014-05-21 32 views
1

我正在映射項目數組,但集合可能相當大。我想每隔一段時間給控制檯發一條消息,以表明進展情況。在繪圖過程中有沒有辦法做到這一點?Ruby在映射時放置週期性進度消息

這是我的地圖聲明:

famgui = family_items.map{|i|i.getGuid} 

我有我使用的時候給我做一個對每個或while循環更新一個DEF。

這是DEF:

def doneloop(saymyname, i) 
    if (i%25000 == 0) 
     puts "#{i} #{saymyname}" 
    end 
end 

我通常把X = 0之前,我開始循環,那麼x + = 1,一旦我在循環,然後在我的循環結束時,我把saymyname = "specific type items gathered at #{Time.now}" 然後我把doneloop(saymyname, x)

我不知道如何做到這一點,當我映射,因爲沒有循環來構造這個周圍。有沒有人有使用地圖時提供更新的方法?

謝謝!

回答

2

你可以用索引映射:

famgui = family_items.with_index.map {|item, index| item.getGuid; doneloop('sth', index)} 
+1

你需要改變你的塊語句的順序,現在你回來doneloop的值,而不是GUID。 – Linuxios

+0

@Linuxios謝謝。 – BroiSatse

+0

這樣對嗎? saymyname =「家庭用品聚集在#{mytime(Time.now)}」 famgui = family_items.with_index.map {doneloop(saymyname,index); | item,index | item.getGuid} – missscripty

2

只有最後表達從圖表返回,所以你可以這樣做:「」

famgui = family_items.with_index.map do |i, idx| 
    if idx % 100 == 0 
    puts # extra linefeed 
    # report every 100th round 
    puts "items left: #{family_items_size - idx}" 
    STDOUT.flush 
    end 
    current_item += 1 
    print "." 
    STDOUT.flush 
    i.getGuid 
end 

這將打印每個項目和每100個項目後的狀態報告。

如果你願意,你可以使用each_with和填充陣列喜歡自己:

famgui = [] 
family_items.each_with_index do |i, idx| 
    famgui << i.getGuid 
    puts "just did: #{idx} of #{family_items.size}" 
end 
+0

我正在映射超過400萬個項目,所以我絕對不想打印。爲每個項目。我發現我正在做的更大的問題是一種實用工具,它將所有的記憶和永遠運行。 – missscripty

+0

這只是一個例子。 –

+1

而不是每次只能刷新一次STDOUT STDOUT.sync = true – peter