ฉันจะใช้“ สวม” กับคอนโซลโดยไม่มีการแบ่งบรรทัดเป็นรูบีบนรางได้อย่างไร?


156

ฉันมีวิธีที่ผ่านการวนรอบ - ฉันต้องการให้ส่งออก "." แต่ละวงดังนั้นฉันสามารถดูได้ในคอนโซล แต่มันทำให้ LINEBREAK puts "."ในตอนท้ายของแต่ละเมื่อฉันใช้

หากมีวิธีการที่จะมีเพียงเส้นต่อเนื่อง?

คำตอบ:


199

คุณต้องใช้การพิมพ์แทนการใส่ นอกจากนี้หากคุณต้องการให้จุดปรากฏอย่างราบรื่นคุณต้องล้างบัฟเฟอร์ stdout หลังการพิมพ์แต่ละครั้ง ...

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

100.times do
  print_and_flush "."
  sleep 1
end

แก้ไข:ฉันแค่มองหาเหตุผลที่อยู่เบื้องหลัง flush เพื่อตอบความคิดเห็นของ @ rubyprince และตระหนักว่าสิ่งนี้สามารถทำความสะอาดได้เพียงแค่ใช้$stdout.sync = true...

$stdout.sync = true

100.times do
  print "."
  sleep 1
end

3
คือ$stdout.flush? จำเป็นจริงๆ .. ฉันใช้ทับทิม 1.8.7 และฉันได้ทำสิ่งที่เพิ่งมีprintและผมไม่มีปัญหา ..
rubyprince

6
มันมีประโยชน์ถ้าคุณทำอะไรบางอย่างเช่นแถบความคืบหน้า เมื่อคุณใช้เพียงอย่างเดียวprintมันสามารถออกมาเป็นบล็อคได้เพราะมันสามารถเก็บไว้ในบัฟเฟอร์แทนที่จะเขียนทันที (ฉันไม่รู้ว่าทำไม) มันอาจเป็นระบบปฏิบัติการที่เฉพาะเจาะจงเช่นกัน
ทำงาน

2
ฉันลองใช้ @ stdout.flush ... ประโยชน์ใด ๆ ของการใช้. sync = true แทน?
Timothy T.

ผมคิดว่าการตั้งค่า stdout จะsyncเป็น overkill เพื่อส่งออกหนึ่งสาย จากนั้นหากคุณแอพส่งออกมากมันจะช้าลง
akostadinov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.