Ruby - 字符式IO.select

时间:2014-11-07 05:34:53

标签: ruby io

有没有办法让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非常接近)。

2 个答案:

答案 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}