2013-10-10 47 views
3
0.upto(9) do 
    STDOUT.print "Flash!" 
    sleep 0.5 
    STDOUT.print "\b\b\b\b\b\b" # (6 backspaces, the length of "Flash!") 
    sleep 0.5 
end 

此代碼不起作用。它將Flash!打印到屏幕上,但不閃爍。它只停留在那裏,好像後臺空間不起作用。但我這樣做:用ruby製作閃爍控制檯信息

0.upto(9) do 
    STDOUT.print "Flash!" 
    sleep 0.5 
    STDOUT.print "\b\b\b\b\b" # (5 backspaces, the length of "Flash! - 1") 
    sleep 0.5 
end 

它幾乎工作。它打印這個:FFFFFFFFFFlash!(9循環後)當它們的數字等於它們正在刪除的字符串的長度時,爲什麼backspaces停止生效?

我該如何克服這個問題並創建一個閃爍的消息,只使用屬於rails的庫?

我試着像這樣的解決方法:

0.upto(9) do 
    STDOUT.print " Flash!" 
    sleep 0.5 
    STDOUT.print "\b\b\b\b\b\b" 
    sleep 0.5 

end 

(注意" Flash!"的空間),但發生的事情是出現的消息在屏幕抓取!一個有趣的效果,但不是我想要的。

我在Windows中使用命令提示符與Ruby和Rails 7

+1

有趣的代碼..我繼續運行,它..和享受輸出:) –

+6

你可能想使用一個庫來做到這一點,如[curses](http://ruby-doc.org/stdlib-1.9。3/libdoc/curses/rdoc /),或者至少是[ANSI庫](https://github.com/rubyworks/ansi)。還要確保設置了「STDOUT.sync = true」。沒有必要指定'STDOUT.print',因爲'print'會默認執行。 – tadman

+0

對不起,如果這是一個初學者的問題,但我可以要求詛咒而無需安裝寶石?默認情況下它是否爲ruby的一部分? – Starkers

回答

5

這通常將寫成這樣:

0.upto(9) do 
    STDOUT.print "\rFlash!" 
    sleep 0.5 
    STDOUT.print "\r  " # Send return and six spaces 
    sleep 0.5 
end 

早在天,當我們談論會對於TTY和點陣打印機,我們很快就會習慣於運輸控制字符,如「\ r」,「\ n」,「\ t」等。今天,人們很少開始這樣做,因爲它們想要使用網絡和瀏覽器;學會與設備交談會晚得多。

「\ r」表示將滑架返回到其原始位置,在打字機上將滾筒一直移動到右側,以便我們可以再次開始在左側邊距上鍵入。帶有移動頭的打印機將此打印頭翻轉並將打印頭一直移動到左側,但無論如何,打印機都會再次從左側邊距開始打印。使用控制檯/ telnet/video-TTY,它將光標移動到左邊距。這完全一樣,只是不同的技術。


多一點可用的常規是:

msg = 'Flash!' 

10.times do 
    print "\r#{ msg }" 
    sleep 0.5 
    print "\r#{ ' ' * msg.size }" # Send return and however many spaces are needed. 
    sleep 0.5 
end 

更改msg你想要什麼,並且代碼會自動使用空格右邊的數字覆蓋的字符。

+0

Darn。比我的更乾淨! – Starkers

+0

這不是我第一次這樣做。 :-)可以更簡單地使用VT-52(或更新的)終端仿真器(如大多數控制檯)和內置的[ANSI轉義代碼](http://en.wikipedia.org/wiki/ ANSI_escape_code)「閃爍」。有關更多信息,請參閱「[Colorized Ruby Output](http://stackoverflow.com/questions/1489183/colorized-ruby-output)」。 –

2

不管怎麼說,它看起來像退格(至少在Windows中)只是將光標定位到後面,你需要/想用空格覆蓋字符在那一點(或其中的6個)將文本「空白」。

1

權的基礎上,@rogerdpack的輸入我設計了一個解決方案:

def flashing_output(output) 
    message = output 
    backspace = "\b" 
    space = " " 

    backspace_array = [] 
    space_array = [] 

    length = message.length 

    length.times do 
     backspace_array << backspace 
     space_array << space 
    end  

    0.upto(9) do 
     print message 
     sleep 0.5 
     print backspace_array.join.to_s + space_array.join.to_s + backspace_array.join.to_s + backspace_array.join.to_s 
     sleep 0.5 
    end 
end 

flashing_output("Flashing Foobars! (not a euphemism)") 
2

或者,你可以使用這個

def text_flasher(text) 
    puts "\e[5m#{text}\e[0m" 
end 

使用text_flasher在控制檯,你會看到神奇:)

+0

您必須在終端模擬器中啓用閃爍文本,通常禁用它。 – Stefan

+0

不適用於Windows,但可以在Mac和Chakra/Ubuntu上工作而不做任何更改:) –