print! 宏

我們在快速入門中就提到過標準輸出的行緩衝。它一個表現就是 print! 宏。如果你在 print! 宏後面接上一個輸入就會發現這種按行緩衝的機制。

fn main() {
    print!("hello!\ninput:");
    let mut input = String::new();
        std::io::stdin()
            .read_line(&mut input)
            .expect("Failed to read line");
    println!("line:{}",input);
}

您可以編譯並運行這段程序試一試,您會發現我們並沒有得到預期的(下劃線代表光標的位置):

hello!
input:_

而是得到了:

hello!
_

這就是由於標準輸出中的這種行緩衝機制,在遇到換行符之前,輸出的內容並不會隱式的刷新,這就導致 print! 宏和 println! 宏實際上並不完全相同。在標準庫中 print! 宏是這樣的:

macro_rules! print {
    ($($arg:tt)*) => { ... };
}

由此,我們可以對它進行改進,使它和 println! 宏被自動刷新,不過這種刷新是一種顯式的刷新。

use std::io::{self, Write};

macro_rules! printf {
    ($($arg:tt)*) =>{
        print!($($arg)*);
        io::stdout().flush().unwrap();
    }
}

此外,當您需要刷新還沒有遇到換行符的一行內容的時候您都可以使用 io::stdout().flush().unwrap(); 進行刷新,不過需要注意的是要先 use std::io::{self, Write}; 如果您不這樣做,將會得到一個錯誤。

results matching ""

    No results matching ""