我希望能够向终端输出两行,然后删除它们。我知道你可以做一些像
这样的事情print "\b"*whatever
但我想做更像这样的事情:
[1, 2, 3, 4, 5].each do |item|
# code to delete the previous two lines
print item.to_s + "\nHello!"
end
输出会快速完成以下所有
1
Hello!
2
Hello!
3
Hello!
4
Hello!
5
Hello!
但到最后,最后的迭代就是你所看到的。
答案 0 :(得分:11)
嗯,对于简单的事情,如果你可以假设一个ANSI兼容的终端(通常是一个不错的选择),你可以直接输出ANSI codes。例如,
5.times do |item|
print "\r" + ("\e[A\e[K"*3) if item > 0
puts "#{item+1}\nHello!"
end
\r
将光标移动到行的开头,\e[A
将光标向上移动一行,\e[K
从光标位置清除到行尾。如果屏幕上不需要任何其他内容,只需将光标移动到所需位置即可发送\e[J
;一直清除到屏幕的末尾。
对于更复杂的内容,您可以先查看the Highline gem。