有没有办法让IO.select
在没有收到EOF
的情况下返回单个输入字符?我希望能够从键盘读取用户输入,就像我从任何其他流中读取一样,就像打开TCP套接字连接一样。它允许我创建一个这样的事件循环:
loop {
rd, _, _ = IO.select([long_lived_tcp_connection, stdin])
case rd[0]
when long_lived_tcp_connection
handle_server_sent_event(rd[0].read)
when stdin
handle_keypress(rd[0].read)
end
}
我一直在调查io/console
,但它并没有给我这种能力(尽管IO#getch
非常接近)。
答案 0 :(得分:2)
您可以将标准输入设置为原始模式(取自this answer):
begin
state = `stty -g`
`stty raw -echo -icanon isig`
loop do
rd, _, _ = IO.select([$stdin])
handle_keypress(rd[0].getc)
end
ensure
`stty #{state}`
end
IO#getc
从stdin返回一个字符。另一个选项是IO#read_nonblock
来读取所有可用数据。
答案 1 :(得分:0)
要一次阅读一个字符,我会使用:
STDIN.each_char {|char| p char}