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}