Ruby STDIN.getc не читает чар на приеме

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

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

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

Он вернет одно "Char пришел" на каждого персонажа, отправленного в stdin, но только после того, как \n был отправлен.

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

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

2 ответа

Решение

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

ОБНОВИТЬ

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

require "highline/system_extensions"
include HighLine::SystemExtensions

while k = get_character
  print k.chr
end

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

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

p get_char # => "q"

/questions/8490771/kak-poluchit-odin-simvol-bez-nazhatiya-klavishi-vvoda/8490794#8490794 и его комментарии - лучший ответ в мире рубинов 2+. Это заблокирует чтение одного символа и выход при нажатии ctrl + c:

require 'io/console'

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

С 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
Другие вопросы по тегам