Ruby STDIN.getc не читает чар на приеме - PullRequest
2 голосов
/ 16 ноября 2011

Кажется, что Ruby IO # getc ждет получения \ n, прежде чем возвращать символы.

Если вы попытаетесь запустить этот скрипт:

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

Будет возвращаться один "Прибыл символ" за символ, отправленный на стандартный ввод, но только после того, как будет отправлено \ n.

Кажется, что все символы буферизируются, даже если я напишу STDIN.sync = true.

Кто-нибудь знает, как заставить скрипт печатать "Чар прибыл" сразу после отправки чара в STDIN?

Ответы [ 2 ]

8 голосов
/ 16 ноября 2011

Был ответ от Маца :)

UPDATE

Также вы можете использовать гем под названием highline , потому что приведенный выше пример может быть связан со странными экранными эффектами:

require "highline/system_extensions"
include HighLine::SystemExtensions

while k = get_character
  print k.chr
end
2 голосов
/ 16 ноября 2011

Адаптировано из другого ответа на вопрос .

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

p get_char # => "q"
...