Wie kann ich "Puts" für die Konsole verwenden, ohne einen Zeilenumbruch in Ruby auf Schienen zu verursachen?

156

Ich habe eine Methode, die eine Schleife durchläuft - ich möchte, dass sie ein "" ausgibt. jede Schleife, damit ich sie in der Konsole sehen kann. Bei jeder Verwendung wird jedoch am Ende jedes Zeilenumbruchs ein Zeilenumbruch angezeigt puts ".".

Gibt es einen Weg, so dass es nur eine durchgehende Linie hat?

Timothy T.
quelle

Antworten:

199

Sie müssen print anstelle von Puts verwenden. Wenn die Punkte gleichmäßig angezeigt werden sollen, müssen Sie den Standardpuffer nach jedem Druck leeren ...

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

100.times do
  print_and_flush "."
  sleep 1
end

Bearbeiten: Ich habe nur die Gründe für Flush untersucht, um auf den Kommentar von @ rubyprince zu antworten, und festgestellt, dass dies durch einfaches Verwenden von $stdout.sync = true...

$stdout.sync = true

100.times do
  print "."
  sleep 1
end
Leerlauffinger
quelle
3
Wird $stdout.flushwirklich benötigt? .. Ich benutze Ruby 1.8.7 und ich habe Dinge nur mit gemacht printund ich hatte keine Probleme ..
Rubyprince
6
Es ist nützlich, wenn Sie so etwas wie einen Fortschrittsbalken ausführen. Wenn Sie es nur printalleine verwenden, kann es in Blöcken ausgegeben werden, da es im Puffer gespeichert werden kann, anstatt sofort geschrieben zu werden (ich weiß nicht genau warum). Es kann auch betriebssystemspezifisch sein.
Idlefingers
2
Ich habe es mit @ stdout.flush versucht ... irgendwelche Vorteile bei der Verwendung von .sync = true stattdessen?
Timothy T.
Ich denke, stdout auf zu setzen syncist ein Overkill, um eine Zeichenfolge auszugeben. Wenn Ihre App dann viel ausgibt, ist sie langsamer.
Akostadinov