我正在使用Ruby。
我有一个包含多行的字符串。我想多次在同一个地方打印多行字符串。
我想这样做的原因是因为字符串表示将要多次更新的信息。
我该如何做到这一点?
答案 0 :(得分:2)
作为选项:
3.times do |i|
print str = "string#{i}\nstring#{i}\nstring#{i}\n"
sleep 1 # just for test
system('clear')
end
答案 1 :(得分:1)
然而,这将在Mac OS X Lion上的Terminal.app中工作,每行的1个字符在退出时被清除。我认为这是Terminal.app的错误。
CR = "\r"
CLEAR = "\e[0J"
RESET = CR + CLEAR
lines_count = 3
3.times do |i|
puts "First line #{i}"
puts "Second line #{i}"
puts "Third line #{i}"
sleep(1)
$stdout.flush
lines_count.times do
print "\e[1F"
print "\e[1K"
end
end
print "\e[#{lines_count}E"
答案 2 :(得分:1)
您可以使用用途curses来处理您的输出,但对于像这样简单的事情,这可能会有点过分。
通常的方法是打印出一堆退格键,将输出光标重新定位在最后一个字符串的开头;请注意,"\b"
并不一定会覆盖任何内容,因此您必须使用空格覆盖末尾以确保安全。像这样:
messages = [
'Professionally simplify seamless systems with prospective benefits.',
'Dramatically cultivate worldwide testing procedures for robust potentialities.',
'Intrinsicly provide access to future-proof testing procedures after superior supply chains.',
'Globally matrix multidisciplinary outsourcing vis-a-vis distributed paradigms.',
'Compellingly fashion visionary content via functionalized web services.',
'Phosfluorescently e-enable e-markets rather than internal or "organic" sources.'
]
reposition = ''
clear_the_end = ''
(0 ... messages.length).each do |i|
if(i > 0)
clear_the_end = ' ' * [0, messages[i - 1].length - messages[i].length].max
end
$stdout.syswrite(reposition + messages[i] + clear_the_end)
reposition = "\b" * (messages[i].length + clear_the_end.length)
sleep 1
end
puts
您需要使用syswrite
来避免缓冲以及puts
附加的常用"\n"
。这种事情应该适用于您可能遇到的任何终端。
你也可以使用回车符("\r"
)而不是一堆退格:
# `reposition = "\b" * (messages[i].length + clear_the_end.length)` becomes
resposition = "\r"
但是你仍然需要所有clear_the_end
摆弄以确保覆盖所有最后一行。