2015-02-25 2 views
0

Я воссоздал реализацию блесны для моей командной строки сценария:Как очистить командную строку кок

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" перед каждой выходной строкой.

+0

Какова цель определения 'глифы =% ш [|/- \\ |/- \\] 'с двумя циклами? Что изменится, если это будет 'GLYPHS =% w [|/- \\] '? – sawa

ответ

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. 
Смежные вопросы