2011-02-08 3 views
8

は、私は、これは私が「BのC D EがF jは、」各文字の間に0.25秒に一度に一つの文字を印刷することが見込まちょうど楽しみのために、一度に1文字ずつ標準出力にゆっくりと印刷するルビープログラムを書くにはどうすればいいですか?

"a b c d e f g h i j k".each {|c| putc c ; sleep 0.25} 

うまくいくかもしれないと思いました。しかし、文字列全体が一度に印刷されます。

答えて

5

2つのこと:

  1. あなたは文字を反復処理するために.each_charを使用する必要があります。 Ruby 1.8では、String.eachが行単位で表示されます。 Ruby 1.9では、String.eachは推奨されていません。
  2. すぐに文字を表示する場合は、$stdoutを手動でフラッシュする必要があります。さもなければ、それらはバッファリングされる傾向があり、文字は最後に一気に現れる。

#!/usr/bin/env ruby 
"a b c d d e f g h i j k".each_char {|c| putc c ; sleep 0.25; $stdout.flush } 
5

2つのこと:

  1. あなたは、あなたがそれにeachを使用する前に、配列にその文字列を分割する必要があります。
  2. output bufferingをオフにします。

    ​​
+2

デフォルトの設定であるsplit()のパラメータは必要ありません。 '.split.each'が行います。 –

+0

@マーク、それはクールです!私は本当にルビーを知らない、私はちょうど楽しみのために答えたが、私は1分erjiangより速かった:D – Nathan

1

試してみてください。

%w"a b c d e f g h i j k".each {|c| putc c ; sleep 0.25} 

各書き込みの間でフラッシュするSTDOUTを必要としないのRuby 1.9.2、とあるとして動作します。

介入するスペースを削除する場合は、%wを削除し、eachの代わりにeach_charを使用します。

2

Rubyバッファは出力され、特定のサイズに達した後に標準出力にフラッシュします。あなたはそれをフラッシュするように強制することができます。

"a b c d e f g h i j k".each_char do |char| 
    putc char 
    $stdout.flush 
    sleep 0.25 
end 

注:印刷されたときに、文字と文字の間にスペースを使用しない場合は、代わりに.each_char.split.eachを使用しています。

slowly do 
    "a b c d e f g h i j k" 
end 
0

これは "スロー印刷" の私の方法です:

あなたがこれを行うことができるだろう

:このような定義を持つ:ちょうど楽しみのため

for i in "a b c d e f g h i j k".chars.to_a print i sleep 0.25 end 
関連する問題