Ruby Put периодические сообщения о ходе выполнения при отображении

Я сопоставляю массив предметов, но коллекция может быть довольно большой. Я хотел бы посылать сообщения на консоль время от времени, чтобы показать прогресс. Есть ли способ сделать это во время процесса картирования?

Это мое утверждение карты:

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

У меня есть определение, которое я использую для предоставления обновления, когда я делаю для каждого цикла или цикла.

Это определение:

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 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

Вы можете сопоставить с индексом:

famgui = family_items.with_index.map {|item, index| item.getGuid; doneloop('sth', index)}
Другие вопросы по тегам