如何清理命令行微调器

时间:2015-02-25 23:39:28

标签: ruby command-line-interface

我为命令行脚本重新创建了一个微调器的实现:

class Spinner
  GLYPHS = %w[| / – \\ | / – \\]
  def render
    Thread.new do
      while true
        GLYPHS.each do |glyph|
          print "\r#{glyph}"
          sleep 0.10
        end
      end
    end
  end
end

用作:

puts "Querying the API..."
@s = Spinner.new
@s.render
# do some stuff, return some data, output it to the command line
puts "All done."

,结果命令行输出类似于

Querying the API...[spinner is spinning here]
\RESULTS
|RESULTS
\RESULTS

|All done.

当脚本结束时,最后一个字形仍然存在。我的理解是打印字符串开头的"\r"用于清理过去的字形。我手动打印"\r",这是不直观的,使代码看起来不太好。我喜欢微调器不要在结果前留下一个字形,而不必在每个输出行之前打印"\r"

1 个答案:

答案 0 :(得分:0)

你需要停止线程。我稍稍调整了你的Spinner课程。

class Spinner

  GLYPHS = %w[| / – \\ | / – \\]

  def initialize(msg = nil)
    print "#{msg}... " unless msg.nil?
    @thread = Thread.new do
      while true
        GLYPHS.each do |glyph|
          print "\b#{glyph}"
          sleep 0.10
        end
      end
    end
  end

  def stop(msg = nil)
    @thread.exit
    print  "\b#{msg}\n"
  end

end

运行时看起来像这样:

Querying the API.../

当这一切都这样完成时:

Querying the API...All done.