rubyの標準入力から一度に1バイトずつ読み取りたいのですが、新しいデータがない場合は、メソッドをすぐに返すようにしたいので、私が見る限り、each_byteなどはオプションではありません。 、プログラムの実行をブロックするためです。
理想的には、この方法で次のようなことができます。
byte = STDIN.next_byte_or_nil
if(byte)
#Process
else
#Do something else
end
どうすればそれを達成できますか?
読み取り操作がブロックされる場合は、例外read_nonblock
をスローする which を使用できます。Errno::WOULDBLOCK
したがってSTDIN.read_nonblock(1) rescue nil
、ブロッキングまたはリターンなしでバイトを読み取りますnil
。
値を使用しnil
て呼び出しが成功したかどうかを確認するだけなので、実際には必要ありませんrescue nil
。
begin
byte = STDIN.read_nonblock(1)
#Process
rescue Errno::WOULDBLOCK
#Do something else
end
readbyteを使用して目標を達成してみてください。
getcは、探しているメソッドです。
byte = STDIN.getc
if byte
# Process
else
# Do something else
end