Как я могу использовать «кладет» на консоль без разрыва строки в ruby ​​на рельсах?

156

У меня есть метод, который проходит через цикл - я хочу, чтобы он вывел «.» каждый цикл, чтобы я мог видеть это в консоли. тем не менее, он ставит перенос строки в конце каждого, когда я использую puts ".".

Есть ли способ, чтобы он просто имел непрерывную линию?

Тимоти Т.
источник

Ответы:

199

Вам нужно использовать печать вместо пут. Кроме того, если вы хотите, чтобы точки отображались плавно, необходимо очищать буфер stdout после каждой печати ...

def print_and_flush(str)
  print str
  $stdout.flush
end

100.times do
  print_and_flush "."
  sleep 1
end

Редактировать: я просто изучал причины, по которым флеш отвечал на комментарий @ rubyprince, и понял, что это можно немного исправить, просто используя $stdout.sync = true...

$stdout.sync = true

100.times do
  print "."
  sleep 1
end
idlefingers
источник
3
Это $stdout.flushдействительно нужно? .. Я использую Ruby 1.8.7, и я print
справился
6
Это полезно, если вы делаете что-то вроде индикатора выполнения. Когда вы просто используете printего самостоятельно, он может появляться блоками, потому что он может храниться в буфере, а не записываться сразу (я не знаю точно, почему). Это также может зависеть от ОС.
праздные пальцы
2
Я попробовал это с @ stdout.flush ... какие-нибудь преимущества использования вместо .sync = true?
Тимоти Т.
Я думаю, что установка stdout sync- это перебор для вывода одной строки. Тогда, если ваше приложение выдает много, это будет медленнее.
Акостадинов