Unixシェルで以前に印刷した行をRubyでどのように上書きしますか?
たとえば、シェルで現在の時刻を毎秒出力したいとしますが、時刻の文字列をスタックするのではなく、以前に表示された時刻を上書きしたいとします。
\r
行末のエスケープシーケンス(次の行でこの行が上書きされます)。あなたの例に従ってください:
require 'time'
loop do
time = Time.now.to_s + "\r"
print time
$stdout.flush
sleep 1
end
エスケープシーケンスを使用する\r
行末-改行のない復帰です。
ほとんどのUNIX端末では、これはあなたが望むことをします:次の行は前の行を上書きします。
前の行より短い場合は、行の終わりにスペースを埋め込むことをお勧めします。
これはRuby固有ではないことに注意してください。このトリックはどの言語でも機能します。
これは、先ほど書いた、配列を受け取り、必要に応じて空白を出力する例です。実行時の速度を制御するには、speed変数のコメントを外します。また、他のスリープ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)}