Консоль продолжает ждать ввода сразу после выполнения, ничего не делая перед оператором gets в Ruby - PullRequest
0 голосов
/ 06 августа 2020

Я новичок в ruby, и эта проблема некоторое время меня беспокоит. Всякий раз, когда я использую get для ввода пользовательского ввода, мой оператор gets выполняется сразу после запуска файла. Я использую git Bash для запуска моего файла file.rb,

puts "some unnecessary text"
puts "Hello world"
puts "now you should input something" 
x = gets.chomp
puts 36
puts "your input is " + x + " right?"

программу должен напечатать первые 3 строки перед ожиданием ввода, но он ждет ввода сразу после того, как я его запустил

$ruby file.rb
|

, он ждет вечность, если я не нажму ввод. Если я напишу что-нибудь,

$ ruby file.rb
myInput
some unnecessary text
Hello world
now you should input something
36
your input is myInput right?

, все будет нормально. Так что я вынужден написать свой вклад в начале. Сейчас это не большая проблема, но когда я буду писать более крупный и сложный код, это вызовет много головной боли. Любые решения?

ps: Кажется, проблема возникает только с git Bash (windows). Powershell отлично работает.

1 Ответ

0 голосов
/ 07 августа 2020

Кажется, что стандартный вывод буферизуется.

Попробуйте поставить в начале файла (первые две строки) old_sync = $stdout.sync $stdout.sync = true и в конце файла (последняя строка) $stdout.sync = old_sync.

Вызов метода IO#sync= устанавливает для режима syn c значение true. Это приводит к тому, что весь вывод немедленно сбрасывается, в конце скрипта мы восстанавливаем его значение до исходного старого значения, подробности см. В Ruby документации .

В итоге:

old_sync = $stdout.sync # cache old value
$stdout.sync = true # set mode to true

# your scripting staff

$stdout.sync = old_sync # restore old value

Если этот трюк работает, по крайней мере, вы знаете причину странного поведения. Вы также можете найти объяснение в этом сообщении SO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...