2011-07-24 104 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擺弄,以確保您覆蓋所有的最後一行。