有没有办法在红宝石中进行一次击键?

时间:2012-08-08 19:06:53

标签: ruby

我需要一种检查键盘的方法,看看是否有任何一个按键被按下,如果是,请拿到钥匙,如果没有,请离开并继续我的生意。我只需要检查大约六个键。我将经常返回检查(即,这个检查是程序的一部分,无休止地重复[只要程序正在运行。]或者,我想我也可以实现它作为一个中断,即,其余的循环,然后在按下时获取密钥。

因为get和getc都在等待返回,所以它们对我不起作用。我在java和Windows上找到了例子,但我在Mac上。

1 个答案:

答案 0 :(得分:3)

要立即阅读角色而不给tty设备编辑角色并等待返回,你需要这样的东西:

system 'stty cbreak'
$stdout.syswrite 'How now: '
q = $stdin.sysread 1
puts
puts "You typed #{q} it seems."
system 'stty cooked'

要添加对可用字符的检查,请将其扩展为执行非阻塞读取...

def read1maybe
  return $stdin.read_nonblock 1
rescue Errno::EAGAIN
  return ''
end

system 'stty cbreak'
while true
  q = read1maybe
  break if q.length > 0
  puts 'you did not change anything'
  sleep 1
end
puts
puts "You typed #{q} it seems."
system 'stty cooked'

有关更详细的内容,请参阅the standard library curses package.您可能还会发现io/console有用。