Jak mogę użyć „puts” na konsoli bez łamania linii w rubinach na szynach?

156

Mam metodę, która przechodzi przez pętlę - chcę, aby wyświetlała znak „.” każdą pętlę, więc mogę to zobaczyć w konsoli. jednak, gdy używam, na końcu każdego umieszcza podział wiersza puts ".".

Czy istnieje sposób, aby miał po prostu ciągłą linię?

Timothy T.
źródło

Odpowiedzi:

199

Musisz użyć print zamiast puts. Ponadto, jeśli chcesz, aby kropki wyglądały gładko, musisz opróżnić bufor stdout po każdym wydruku ...

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

100.times do
  print_and_flush "."
  sleep 1
end

Edycja: właśnie szukałem przyczyny koloru, aby odpowiedzieć na komentarz @ rubyprince, i zdałem sobie sprawę, że można to trochę wyczyścić, po prostu używając $stdout.sync = true...

$stdout.sync = true

100.times do
  print "."
  sleep 1
end
bezczynni
źródło
3
Czy jest to $stdout.flushnaprawdę potrzebne? .. Używam Rubiego 1.8.7 i zrobiłem rzeczy tylko z printi nie miałem żadnych problemów ..
rubyprince
6
Jest to przydatne, jeśli robisz coś w rodzaju paska postępu. Kiedy używasz printgo sam, może wyjść w blokach, ponieważ może być przechowywany w buforze, zamiast być zapisywany od razu (nie wiem dokładnie dlaczego). Może to być również specyficzne dla systemu operacyjnego.
idlefingers
2
Wypróbowałem to z @ stdout.flush ... jakieś korzyści z używania zamiast tego .sync = true?
Timothy T.
Myślę, że ustawienie stdout na syncto przesada, aby wyprowadzić jeden ciąg. Jeśli aplikacja generuje dużo, będzie wolniejsza.
akostadinov