我想从ruby中的标准输入一次读取一个字节,但是,如果没有新的数据可用,我希望方法立即返回,以便each_byte等。对我来说不是一种选择,就我所知,因为它们阻止了程序的执行。从标准输入获取下一个字节或零 - Ruby
理想的方法将我允许做这样的事情:
byte = STDIN.next_byte_or_nil
if(byte)
#Process
else
#Do something else
end
如何做到这一点?
我想从ruby中的标准输入一次读取一个字节,但是,如果没有新的数据可用,我希望方法立即返回,以便each_byte等。对我来说不是一种选择,就我所知,因为它们阻止了程序的执行。从标准输入获取下一个字节或零 - Ruby
理想的方法将我允许做这样的事情:
byte = STDIN.next_byte_or_nil
if(byte)
#Process
else
#Do something else
end
如何做到这一点?
如果读操作阻塞,则可以使用,该异常会引发Errno::WOULDBLOCK
异常。因此STDIN.read_nonblock(1) rescue nil
将读取一个字节而不会阻止或返回nil
。
既然你只使用nil
值,查看呼叫是否成功,你并不真正需要的rescue nil
虽然:
begin
byte = STDIN.read_nonblock(1)
#Process
rescue Errno::WOULDBLOCK
#Do something else
end
getc是你要寻找的方法:
byte = STDIN.getc
if byte
# Process
else
# Do something else
end
你可以尝试使用readbyte来实现自己的目标。
与其他答案一样的问题。它只是阻止程序执行,直到用户键入内容。 – 2013-03-18 12:32:07
已输入但尚未读取的数据的存在。 – 2013-03-18 12:38:42
不为我工作。虽然#Process部分正确执行,但第二部分从不执行,因为getc会等待用户实际键入某些内容,这不是我想要的。 – 2013-03-18 12:30:12