3

Ruby IO#getcは、文字を返す前に\nを受信するまで待機しているようです。

このスクリプトを実行しようとすると、次のようになります。

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

stdinに送信された文字ごとに1つの「到着した文字」が返されますが、\nが送信された後でのみです。

STDIN.sync = trueと書いても、すべての文字がバッファリングされているようです。

文字がSTDINに送信された直後に、スクリプトに「文字が到着しました」と出力する方法を知っている人はいますか?

4

4 に答える 4

8

マッツからの回答がありました:)

アップデート

また、上記の例を使用すると奇妙な画面効果にリンクされる可能性があるため、highlineというタイトルのgemを使用できます。

require "highline/system_extensions"
include HighLine::SystemExtensions

while k = get_character
  print k.chr
end
于 2011-11-15T20:57:43.773 に答える
2

別の回答された質問から適応。

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

p get_char # => "q"
于 2011-11-15T21:04:37.340 に答える
0

https://stackoverflow.com/a/27021816/203673とそのコメントは、ruby2+の世界での最良の答えです。これにより、ブロックされて1つの文字が読み取られ、ctrl+cが押されたときに終了します。

require 'io/console'

STDIN.getch.tap { |char| exit(1) if char == "\u0003" }
于 2019-07-25T15:48:03.347 に答える
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
于 2020-05-14T17:15:36.110 に答える