【问题标题】:Get next byte or nil from standard input – Ruby从标准输入中获取下一个字节或零 - Ruby
【发布时间】:2013-03-18 12:15:38
【问题描述】:

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

理想情况下,我允许这样做:

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

我如何做到这一点?

【问题讨论】:

    标签: ruby stream stdin


    【解决方案1】:

    如果读取操作会阻塞,您可以使用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
    

    【讨论】:

      【解决方案2】:

      getc 是您正在寻找的方法:

      byte = STDIN.getc
      if byte
        # Process
      else
        # Do something else
      end
      

      【讨论】:

      • 对我不起作用。虽然#Process 部分正确执行,但第二部分永远不会执行,因为 getc 等待用户实际输入内容,这不是我想要的。
      【解决方案3】:

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

      【讨论】:

      • 与其他答案相同的问题。它只是阻止程序执行,直到用户输入内容。
      • 存在已输入但尚未读取的数据。
      猜你喜欢
      • 2017-12-12
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多