打印!宏被乱序执行
print! macro gets executed out of order
我的部分代码如下所示:
print_usage_instructions();
print!("Command: ");
let stdin = io::stdin();
let mut line = String::new();
stdin.lock().read_line(&mut line).expect("Couldn't process the command.");
println!("{}", line);
我期望的行为是这样的:
Usage instructions and stuff
Command: [my command]
[my command]
然而,结果是这样的:
Usage instructions and stuff
[my command]
Command: [my command]
知道为什么会这样吗? AFAIK,编译器没有理由在这里更改执行顺序,这部分代码不是异步的,也不是多线程的。
问题:print!()
不刷新标准输出!
你问 flushing 是什么意思?打印时,您不想将每个字符单独发送到标准输出:这会产生大量开销(想想:进行系统调用,终端必须更新其视图,...)。因此,不是这样做,而是在某处存在一个缓冲区,用于保存即将打印的内容。要实际打印,此缓冲区必须 flushed.
您几乎没有注意到所有这些的原因是,当打印换行符 ('\n'
) 时,stdout 总是被刷新。因此,println!()
总是刷新!
您的用例更加令人困惑,因为您正在输入标准输入。在这里它的工作方式几乎相同:当您键入时,字符尚未发送到任何地方!只有 terminal/shell 存储您键入的内容。但是一旦你按下回车键(换行符),你的书面文本就会被提交并发送到标准输入。
无论如何,您可以 manually flush stdout 不打印换行符:
use std::io::{self, BufRead, Write};
fn main() {
println!("Usage instructions and stuff");
print!("Command:");
io::stdout().flush().expect("Couldn't flush stdout"); // <-- here
let stdin = io::stdin();
let mut line = String::new();
stdin.lock().read_line(&mut line).expect("Couldn't process the command.");
println!("{}", line);
}
此行为之前曾被批评:"print!
should flush stdout"。
请注意:您的字符串 line
在最后包含一个换行符。您可以使用 trim_right()
将其删除。这与您原来的问题无关,但您也可能 运行 遇到这个问题 ;-)
我的部分代码如下所示:
print_usage_instructions();
print!("Command: ");
let stdin = io::stdin();
let mut line = String::new();
stdin.lock().read_line(&mut line).expect("Couldn't process the command.");
println!("{}", line);
我期望的行为是这样的:
Usage instructions and stuff
Command: [my command]
[my command]
然而,结果是这样的:
Usage instructions and stuff
[my command]
Command: [my command]
知道为什么会这样吗? AFAIK,编译器没有理由在这里更改执行顺序,这部分代码不是异步的,也不是多线程的。
问题:print!()
不刷新标准输出!
你问 flushing 是什么意思?打印时,您不想将每个字符单独发送到标准输出:这会产生大量开销(想想:进行系统调用,终端必须更新其视图,...)。因此,不是这样做,而是在某处存在一个缓冲区,用于保存即将打印的内容。要实际打印,此缓冲区必须 flushed.
您几乎没有注意到所有这些的原因是,当打印换行符 ('\n'
) 时,stdout 总是被刷新。因此,println!()
总是刷新!
您的用例更加令人困惑,因为您正在输入标准输入。在这里它的工作方式几乎相同:当您键入时,字符尚未发送到任何地方!只有 terminal/shell 存储您键入的内容。但是一旦你按下回车键(换行符),你的书面文本就会被提交并发送到标准输入。
无论如何,您可以 manually flush stdout 不打印换行符:
use std::io::{self, BufRead, Write};
fn main() {
println!("Usage instructions and stuff");
print!("Command:");
io::stdout().flush().expect("Couldn't flush stdout"); // <-- here
let stdin = io::stdin();
let mut line = String::new();
stdin.lock().read_line(&mut line).expect("Couldn't process the command.");
println!("{}", line);
}
此行为之前曾被批评:"print!
should flush stdout"。
请注意:您的字符串 line
在最后包含一个换行符。您可以使用 trim_right()
将其删除。这与您原来的问题无关,但您也可能 运行 遇到这个问题 ;-)