2011-11-15 7 views
2

Ruby IO#getcは文字を返す前に\ nを受け取るまで待機しているようです。Ruby STDIN.getcが受信時に文字を読み取らない

あなたは、このスクリプトを実行しようとした場合:

STDOUT.sync = true 
STDIN.sync = true 
while data = STDIN.getc 
    STDOUT.puts "Char arrived" 
end 

それは1標準入力に送られた文字ごとに「シャアが到着した」が、唯一の\ nは後に送られてきたが返されます。

STDIN.sync = trueと書いても、すべてのcharがバッファリングされているようです。

チャドがSTDINに送信された直後に、「Char arrived」というスクリプトの印刷方法を知っている人はいますか?

+1

[すぐにコンソールからの単一のシャアを取得](http://stackoverflow.com/questions/8072623/get-single-char-from-console-immediately)の可能性が重複したり、[1文字を取得する方法RubyでEnterキーを押さないでください(http://stackoverflow.com/questions/174933/how-to-get-a-single-character-in-ruby-without-pressingenter)(いくつかの良い答えがありますこれを解決する)。 – Phrogz

答えて

8

ありましたan answer from Matz :)

またUPDATE

、上記の例使用すると、変な画面効果にリンクさせることができるので、あなたは、宝石highlineを受ける権利使用することができます。

require "highline/system_extensions" 
include HighLine::SystemExtensions 

while k = get_character 
    print k.chr 
end 
+0

+1は11.5年以上前の投稿を引用しています。 :)あなたがあなたにコンパイルできる答えについては、私がリンクしている質問を見てください。 – Phrogz

+0

ええ、その投稿は古代ですが、あなたが見ることができるように、それはまだ実際です:D – WarHog

+0

あなたの素早い答えに感謝します。これは私の一日になります。私が他のプログラムで持っていたいくつかの奇妙な行動について説明します。 – Martinos

2

から適応another answered questionから。

def get_char 
    begin 
    system("stty raw -echo") 
    str = STDIN.getc 
    ensure 
    system("stty -raw echo") 
    end 
    str.chr 
end 

p get_char # => "q" 
+0

この非ブロック版については、http://stackoverflow.com/q/8274275/190135を参照してください。 – AlexChaffee

関連する問題