1

我想从 ruby​​ 的标准输入中一次读取一个字节,但是,如果没有可用的新数据,我希望该方法立即返回,所以 each_byte 等对我来说不是一个选项,据我所知,因为它们会阻止程序执行。

理想情况下,该方法允许我执行以下操作:

byte = STDIN.next_byte_or_nil
if(byte)
#Process
else
#Do something else
end

我该如何做到这一点?

4

3 回答 3

3

如果读取操作会阻塞,您可以使用read_nonblockwhich throws an exception。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
于 2013-03-18T12:35:31.873 回答
0

getc是您正在寻找的方法:

byte = STDIN.getc
if byte
  # Process
else
  # Do something else
end
于 2013-03-18T12:20:25.507 回答
0

您可以尝试使用readbyte来实现您的目标。

于 2013-03-18T12:28:36.197 回答