7

我希望能够将两行输出到终端,然后将它们都删除。我知道你可以通过做类似的事情来做到这一点

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!

但到最后,最终的迭代将是你所看到的。

4

1 回答 1

14

好吧,对于简单的事情,如果你可以假设一个 ANSI 兼容的终端(通常是一个不错的选择),你可以直接输出ANSI 代码。例如,

 5.times do |item|
    print "\r" + ("\e[A\e[K"*3) if item > 0
    puts "#{item+1}\nHello!"
 end

where\r将光标移动到行首,\e[A将光标向上移动一行,然后\e[K从光标位置清除到行尾。如果您不需要屏幕下方的任何内容,您也可以在\e[J将光标移至所需位置后发送;一直清除到屏幕的末尾。

对于更复杂的东西,您可以从查看Highline gem开始。

于 2013-02-20T02:52:39.130 回答