Ruby STDIN.getc在接收时不读取char

时间:2011-11-15 20:45:19

标签: ruby stdin getc

似乎Ruby IO#getc在返回字符之前一直等到接收到\ n。

如果您尝试运行此脚本:

STDOUT.sync = true
STDIN.sync = true
while data = STDIN.getc
  STDOUT.puts "Char arrived"
end

每个发送到stdin的字符将返回一个“Char arrival”,但只有在发送了\ n之后才会返回。

即使我写STDIN.sync = true,似乎所有char都被缓冲。

有人知道如何在将字符发送到STDIN后立即打印“Char到达”脚本吗?

4 个答案:

答案 0 :(得分:8)

an answer from Matz:)

<强>更新

此外,您可以使用名为highline的宝石,因为使用上面的示例可能会与奇怪的屏幕效果相关联:

require "highline/system_extensions"
include HighLine::SystemExtensions

while k = get_character
  print k.chr
end

答案 1 :(得分:2)

改编自another answered question

def get_char
  begin
    system("stty raw -echo")
    str = STDIN.getc
  ensure
    system("stty -raw echo")
  end
  str.chr
end

p get_char # => "q"

答案 2 :(得分:0)

https://stackoverflow.com/a/27021816/203673及其评论是在ruby 2+世界中最好的答案。这将阻止读取单个字符并在按ctrl + c时退出:

require 'io/console'

STDIN.getch.tap { |char| exit(1) if char == "\u0003" }

答案 3 :(得分:0)

来自https://flylib.com/books/en/2.44.1/getting_input_one_character_at_a_time.html

def getch
  state = `stty -g`
  begin
    `stty raw -echo cbreak`
    $stdin.getc
  ensure
    `stty #{state}`
  end
end

while (k = getch)
  print k.chr.inspect
  sleep 0.2
end