如何在同一个地方多次打印多行字符串?

时间:2011-07-24 19:43:57

标签: ruby special-characters

我正在使用Ruby。

我有一个包含多行的字符串。我想多次在同一个地方打印多行字符串。

我想这样做的原因是因为字符串表示将要多次更新的信息。

我该如何做到这一点?

3 个答案:

答案 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摆弄以确保覆盖所有最后一行。