Ktouth Brand. on Web

け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト



[2011年05月16日]

標準入力と timeout

2011年05月17日 08:14更新 筆者:K.Ktouth

たのしいRuby 第3版(AA)

mixiでそんな内容の質問があったのを見て、ちょろっと興味が湧いてコードを検証してみました。
質問された方のコードではうまく行かないだろうなぁ……というのはすぐにわかったんですが、ではどうしたらうまく行くのか? そこが結局わからないというか、実装依存する上に標準入力に制御が行くとruby側で中断出来ない模様。

具体的には、 IO.select を使用すると時間制限付きで入力監視が出来るんですが、実際は入力に区切りが来ないとrubyに制御が戻らないというお話のよーで。

while ret = IO.select([STDIN], nil, nil, 5.0)
 print '!'
 break if ret[0][0].read(1) =~ /^[\n\r]$/
 print '.'
end

というコードで文字入力を行うと、最初の「!」が表示された後、入力文字数と同じだけの「.」が表示されることを期待するわけですが……エンターキーを押すまで表示は抑制され、押されたあとにまとめて表示されます。

んー、rubyコードと言うより標準入力(Cレベルでの)の実装が邪魔をしている気がする……
一文字毎に制御を返す方法ってナインかなぁ……?

本日のリンク元
アンテナ
その他のリンク元
検索