2011-07-24 66 views
1

我正在使用Ruby。如何多次在同一地点打印多行字符串?

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

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

我怎样才能做到这一点?

+0

添加期望的输入和期望的输出的例子,不能说我能理解你在这里寻找什么。 –

+0

@Mauricio:检查纳什的答案。这是我想要达到的行为。我希望能够使用'\ r',它可以做我想要的一条线,而且它更干净。如果您可以提出更好的答案,请添加新答案。 – Nerian

回答

2

作为一个选项:

3.times do |i| 
    print str = "string#{i}\nstring#{i}\nstring#{i}\n" 
    sleep 1 # just for test 
    system('clear') 
end 
+0

我接受你的答案,因为它最简单,并将在任何情况下工作。 – Nerian

+0

如你答应,会“清除”“在任何情况下工作”吗?我不相信。在Windows上,系统调用(至少它曾经是)将是'cls'。 – vgoff

1

这将在Terminal.app工作,但在Mac OS X Lion的每行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" 
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避免缓冲和平常"\n"puts追加。这种事情应该在你可能遇到的任何终端中工作。

您也可以使用回车("\r"),而不是一堆退格的:

# `reposition = "\b" * (messages[i].length + clear_the_end.length)` becomes 
resposition = "\r" 

但你仍然需要所有的clear_the_end摆弄,以确保您覆盖所有的最后一行。