rust - 打印!宏被乱序执行

标签 rust rust-macros

<分区>

我的部分代码如下所示:

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!() 不刷新标准输出!

你问脸红是什么意思?打印时,您不想将每个字符单独发送到标准输出:这会产生大量开销(想想:进行系统调用,终端必须更新其 View ,...)。因此,不是这样做,而是在某处存在一个缓冲区,用于保存即将打印的内容。要实际打印,必须刷新此缓冲区。

您几乎没有注意到所有这些的原因是,当打印换行符 ('\n') 时,stdout 总是被刷新。因此,println!() 总是刷新!

您的用例更加令人困惑,因为您正在输入标准输入。在这里它的工作方式几乎相同:当您键入时,字符尚未发送到任何地方!只有终端/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() 将其删除.这与您原来的问题无关,但您也可能会遇到这个问题;-)

关于rust - 打印!宏被乱序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49607156/

相关文章:

file - 如何跳过导致 rust 执行的错误?

reference - 如何使用 Rust 中的引用将 FnMut 闭包传递给函数?

rust - 如何在矢量上使用 map ?

generics - 使用宏编写 const 泛型枚举组合

rust - 更高等级的特征边界和函数参数

http - 如何在 Rust 中使用媒体文件正确格式化 HTTP 响应

rust - 是否可以通过委托(delegate)给结构成员来创建实现 Ord 的宏?

rust - 无法在宏中使用自身,因为宏扩展忽略了标记 `self`

rust - 使用syn获取ItemImpl的特征名称和通用参数

macros - tt 元变量类型在 Rust 宏中意味着什么?