【发布时间】:2013-03-18 12:15:38
【问题描述】:
我想从 ruby 的标准输入中一次读取一个字节,但是,如果没有可用的新数据,我希望该方法立即返回,因此 each_byte 等对我来说不是一个选项,就我可以看到,因为它们会阻止程序执行。
理想情况下,我允许这样做:
byte = STDIN.next_byte_or_nil
if(byte)
#Process
else
#Do something else
end
我如何做到这一点?
【问题讨论】:
我想从 ruby 的标准输入中一次读取一个字节,但是,如果没有可用的新数据,我希望该方法立即返回,因此 each_byte 等对我来说不是一个选项,就我可以看到,因为它们会阻止程序执行。
理想情况下,我允许这样做:
byte = STDIN.next_byte_or_nil
if(byte)
#Process
else
#Do something else
end
我如何做到这一点?
【问题讨论】:
如果读取操作会阻塞,您可以使用read_nonblock 引发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 来实现您的目标。
【讨论】: