Как отобразить прогресс на основе количества обработанных элементов вместо количества их «затрат» с помощью «ruby-progressbar»? - PullRequest
2 голосов
/ 08 марта 2019

Давайте инициализируем массив случайными числами. Теперь давайте создадим ProgressBar с суммой всех чисел в качестве его размера. Мы можем легко перебирать все числа и увеличивать индикатор выполнения с каждым числом, что дает нам очень аккуратный и точный прогресс:

require 'ruby-progressbar'

items = Array.new(100) { rand 1..10 }

progress_bar = ProgressBar.create total: items.sum, format: '%a %e %P% Processed: %c from %C items'

items.each do |item|
  sleep item / 100.0
  progress_bar.progress += item
end

Тем не менее, пользователь заинтересован в том, чтобы узнать, сколько предметов обрабатывается, пока идет процесс, а не взвешенные затраты на товары. Теперь мы показываем, например, Processed: 270 from 516 items, который является суммой уже обработанных предметов в сравнении с общей суммой. Вместо этого я хочу показать Processed: 53 from 100 items, но оставить за кадром общую сумму и приращение, чтобы они были такими, какие они есть сейчас, иначе индикатор выполнения не будет точным.

ruby-progressbar предлагает следующие флаги для форматирования .

Я не вижу никаких вариантов размещения заполнителей или получения значений в нем.

1 Ответ

1 голос
/ 08 марта 2019

Вы можете настроить строку формата в реальном времени при обработке и обновить значения самостоятельно внутри строки формата.Ниже приведен модифицированный скрипт, показывающий, что я имею в виду:

require 'ruby-progressbar'

items = Array.new(100) { rand 1..10 }
current = 0
count = items.count
progress_bar = ProgressBar.create total: items.sum, format: "%a %e %P% Processed: #{current} from #{count} items"

items.each do |item|
  sleep item / 100.0
  current += 1
  progress_bar.format = "%a %e %P% Processed: #{current} from #{count} items"
  progress_bar.progress += item
end

Пример вывода: Time: 00:00:01 ETA: 00:00:04 29.48% Processed: 27 from 100 items

...