読者です 読者をやめる 読者になる 読者になる

harry’s memorandum

おれおれメモ

rubyでプログレスバーの備忘録

前にid:kenkitiiさんとプログレスバーで盛り上がったので忘れないように備忘録。

簡単なサンプル。

#!/usr/bin/ruby

class Progress
  def initialize(word = ".")
    @cnt = 0
    @space = " "
    @word = word
  end
  def bar(interval = 0.05)
     sleep interval
     @cnt += 1
     STDERR.print("\r#{@word*@cnt}\r")
  end
  def clear
     cnt = @cnt * @word.size
     STDERR.print("\r#{@space*cnt}\r")
  end
end

pg = Progress.new(".")
(1...20).each {|x|
  pg.bar
}
pg.clear

こんな感じになる。

$ ruby x.rb
.............

ピリオドで進捗だとそっけないと思う場合は適当にwordを変更してください。Progress.new("(^-^)")だとこんな感じ。

$ ruby x.rb
(^-^)(^-^)(^-^)(^-^)(^-^)(^-^)(^-^)(^-^)(^-^)(^-^)(^-^)


でも、ちゃんとプログレスバーを出すのだったらRuby/ProgressBarを使う方が良いと思います。

% irb --simple-prompt -r progressbar
>> pbar = ProgressBar.new("test", 100)
=> (ProgressBar: 0/100)
>> 100.times {sleep(0.1); pbar.inc}; pbar.finish
test:          100% |oooooooooooooooooooooooooooooooooooooooo| Time: 00:00:10
=> nil

>> pbar = ProgressBar.new("test", 100)
=> (ProgressBar: 0/100)
>> (1..100).each{|x| sleep(0.1); pbar.set(x)}; pbar.finish
test: