Ответ 1
Обычно puts
не записывается непосредственно в STDOUT
, но буферизирует строки внутри и записывает вывод в более крупные фрагменты. Это делается потому, что операции ввода-вывода выполняются медленно, и, как правило, имеет смысл избегать непосредственной записи каждого отдельного символа на консоль.
Такое поведение приводит к проблемам в определенных ситуациях. Представьте, что вы хотите создать индикатор выполнения (запустите цикл, который выводит одиночные точки между большими вычислениями). При буферизации результат может заключаться в том, что на какое-то время нет какого-либо вывода, а затем сразу сразу выводятся несколько точек.
Чтобы избежать этого поведения и вместо этого немедленно записать в STDOUT
, вы можете установить STDOUT
в режим синхронизации следующим образом:
STDOUT.sync = true
Из docs:
Когда режим синхронизации имеет значение true, все выходные данные немедленно очищаются от базовой операционной системы и не буферизируются внутри.