2011-01-21 32 views
19

Tôi đã chạy các chương trình dòng lệnh xuất ra một dòng, và sau đó cập nhật dòng đó một lát sau. Nhưng với ruby ​​tôi chỉ có thể xuất hiện một dòng và sau đó một dòng khác.Viết qua các dòng đầu ra trước đó trong dấu nhắc lệnh với ruby ​​

Những gì tôi đã đang được đầu ra bây giờ:

Downloading file: 
11MB 294K/s 
12MB 307K/s 
14MB 294K/s 
15MB 301K/s 
16MB 300K/s 
Done! 

Và thay vào đó, tôi muốn thấy điều này:

Downloading file: 
11MB 294K/s 

Tiếp theo một lúc sau của thành viên này:

Downloading file: 
16MB 300K/s 
Done! 

Dòng kết quả đầu ra kịch bản ruby ​​của tôi cho thấy tốc độ truyền tải và tốc độ truyền tải sẽ được ghi đè mỗi lần thay vì danh sách nhập các giá trị được cập nhật thành một dòng hoàn toàn mới.

Tôi hiện đang sử dụng puts để tạo đầu ra, rõ ràng không được thiết kế cho trường hợp này. Có một phương thức đầu ra khác có thể đạt được kết quả này không?

Trả lời

38

Sử dụng \r để di chuyển con trỏ đến đầu dòng. Và bạn không nên sử dụng puts vì nó thêm \n, thay vào đó hãy sử dụng print. Như thế này:

print "11MB 294K/s" 
print "\r" 
print "12MB 307K/s" 

Một điều cần lưu ý mặc dù: \r không xóa bất cứ điều gì, nó chỉ di chuyển con trỏ trở lại, vì vậy bạn sẽ cần phải pad đầu ra với không gian để ghi đè lên đầu ra trước đó (trong trường hợp nó dài hơn).

Theo mặc định khi \n được in ra đầu ra tiêu chuẩn, bộ đệm bị xóa. Bây giờ bạn có thể cần phải sử dụng STDOUT.flush sau print để đảm bảo văn bản được in ngay lập tức.

+1

Giải pháp này không hiển thị đầu ra cho đến khi một dòng mới là đầu ra, hoặc chương trình kết thúc, có vẻ như. Ví dụ này, ví dụ 'in '123'; ngủ 5; in "\ r"; in "456" 'không in ra bất cứ thứ gì lúc đầu, và sau đó in ra" 456 "5 giây sau đó. Vì vậy, nó không giúp tôi nhiều. –

+1

Thêm 'STDOUT.flush' để gửi nó đến đầu ra ngay lập tức. Tôi cũng đã cập nhật câu trả lời. – detunized

+0

Ahhhh có ý nghĩa. Đó là cố định và làm việc của nó tuyệt vời bây giờ, cảm ơn bạn! –

Các vấn đề liên quan