Ruby – 字符式IO.select
有没有办法让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
非常接近)。
您可以将stdin设置为原始模式(取自此答案 ):
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
来读取所有可用数据。
要一次读一个字符,我会使用:
STDIN.each_char {|char| p char}