Bagaimana saya bisa menggunakan "menempatkan" ke konsol tanpa jeda baris di ruby ​​pada rel?

156

Saya memiliki metode yang melewati loop - Saya ingin itu menghasilkan "." setiap loop jadi saya bisa melihatnya di konsol. Namun, itu menempatkan linebreak di akhir setiap saat saya gunakan puts ".".

Jika ada cara sehingga hanya memiliki garis kontinu?

Timothy T.
sumber

Jawaban:

199

Anda harus menggunakan cetakan alih-alih menempatkan. Juga, jika Anda ingin titik-titik muncul dengan lancar, Anda perlu menyiram buffer stdout setelah setiap cetak ...

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

100.times do
  print_and_flush "."
  sleep 1
end

Sunting: Saya hanya melihat alasan di balik siram untuk menjawab komentar @ rubyprince, dan menyadari bahwa ini dapat dibersihkan sedikit dengan hanya menggunakan $stdout.sync = true...

$stdout.sync = true

100.times do
  print "."
  sleep 1
end
idlefingers
sumber
3
Benar- $stdout.flushbenar diperlukan? .. Saya menggunakan Ruby 1.8.7 dan saya telah melakukan banyak hal hanya dengan printdan saya tidak punya masalah ..
rubyprince
6
Ini berguna jika Anda melakukan sesuatu seperti progress bar. Ketika Anda hanya menggunakan printdengan sendirinya, itu bisa keluar dalam blok karena dapat disimpan dalam buffer alih-alih ditulis langsung (saya tidak tahu persis mengapa). Mungkin spesifik untuk OS.
idlefingers
2
Saya mencobanya dengan @ stdout.flush ... ada manfaatnya dengan menggunakan .sync = true?
Timothy T.
Saya pikir pengaturan stdout ke syncadalah pembunuhan yang berlebihan untuk menghasilkan satu string. Maka jika Anda banyak keluaran aplikasi akan lebih lambat.
akostadinov