Подтвердить что ты не робот

Как переписать печатную строку в оболочке с помощью Ruby?

Как переписать ранее напечатанную строку в оболочке Unix с помощью Ruby?

Скажем, я хотел бы выводить текущее время на оболочку каждую секунду, но вместо укладки каждой строки времени я бы хотел перезаписать ранее отображаемое время.

4b9b3361

Ответ 1

Вы можете использовать escape-последовательность \r в конце строки (следующая строка перезапишет эту строку). Следуя вашему примеру:

require 'time'

loop do
  time = Time.now.to_s + "\r"
  print time
  $stdout.flush
  sleep 1
end

Ответ 2

Используйте escape-последовательность \r в конце строки - это возврат каретки без подачи строки.

На большинстве терминалов unix это сделает то, что вы хотите: следующая строка перезапишет предыдущую строку.

Возможно, вы захотите проложить конец ваших строк пробелами, если они короче предыдущих строк.

Обратите внимание, что это не относится к Ruby. Этот трюк работает на любом языке!

Ответ 3

Вот пример, который я только что написал, который берет Array и выводит пробелы, если это необходимо. Вы можете раскомментировать переменную скорости, чтобы контролировать скорость во время выполнения. Также удалите другой сон 0.2. Последняя часть массива должна быть пустой, чтобы выводить весь массив, все еще работая над ее исправлением.

#@speed = ARGV[0]

strArray = [ "First String there are also things here to backspace", "Second Stringhereare other things too ahdafadsf", "Third String", "Forth String", "Fifth String", "Sixth String", " " ]


#array = [ "/", "-", "|", "|", "-", "\\", " "]

def makeNewLine(array)
    diff = nil
    print array[0], "\r"
    for i in (1..array.count - 1)
        #sleep @speed.to_f
        sleep 0.2
        if array[i].length < array[i - 1].length
             diff = array[i - 1].length - array[i].length
        end
        print array[i]
        diff.times { print " " } if !diff.nil?
        print "\r"
        $stdout.flush

    end
end

20.times { makeNewLine(strArray) }

#20.times { makeNewLine(array)}