为什么在打印前读取输入?

mno*_*ber 8 rust

我在使用一些基本的I/O时遇到了一些问题.具体来说,在输入我的名字并点击,文本"请输入您的姓名"将写入输出Enter:

use std::io;

fn main() {
    print!("Please enter your name: ");

    let mut name = String::new();
    match io::stdin().read_line(&mut name) {
        Ok(_) => println!(""),
        Err(err) => println!("Could not parse input: {}", err)
    }

    println!("Hello, {}!", name.trim());
}
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

Compiling chat v0.1.0 (file:///home/marcus/dev/rust/chat)
  Running `target/debug/chat`
marcus
Please enter your name: 
Hello, marcus!
Run Code Online (Sandbox Code Playgroud)

第一个"马库斯"是我进入的地方.为什么程序在等待输入之前不打印"请输入你的名字"?


是否有可能"什么都不做",如果返回的ResultOk?在示例中,Ok()表示我已将输入保存在变量名称中.那很棒.但Ok() =>在这种情况下我该怎么办?

Lee*_*Lee 13

这是在解释文件print!.由于print!不发出换行符并且stdout是行缓冲的,因此您将看不到任何输出.你可以手动刷新标准输出:

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

print!("Please enter your name: ");
io::stdout().flush();
Run Code Online (Sandbox Code Playgroud)

对于第二个问题,您可以始终明确返回单位:

Ok(_) => (),
Run Code Online (Sandbox Code Playgroud)

所以你的程序变成:

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

fn main() {
    print!("Please enter your name: ");
    io::stdout().flush();

    let mut name = String::new();
    match io::stdin().read_line(&mut name) {
        Ok(_) => (),
        Err(err) => println!("Could not parse input: {}", err)
    }

    println!("Hello, {}!", name.trim());
}
Run Code Online (Sandbox Code Playgroud)

正如@Veedrac在他们的(现已删除的)评论中所指出的那样,你可以用一个if let expression代替match结果read_line:

if let Err(err) = io::stdin().read_line(&mut name) {
    println!("Could not parse input: {}", err)
}
Run Code Online (Sandbox Code Playgroud)


DK.*_*DK. 10

为什么程序在等待输入之前不打印"请输入你的名字"?

嗯,确实如此.只是出于性能原因,标准输出被缓冲.写完了,但它只是写入内存.如果您希望它实际显示给用户,则必须触发刷新.这可以通过编写换行符或通过显式执行来完成:

io::Write::flush(&mut io::stdout()).expect("flush failed!");

// If you "use" `io::Write`...
io::stdout().flush().expect("flush failed!");
Run Code Online (Sandbox Code Playgroud)

此外,如果返回的结果是好的,是否可以"无所事事"?

当然.只是......什么都不做.

match io::stdin().read_line(&mut name) {
    Ok(_) => { /* nothing */ },
    Err(err) => println!("Could not parse input: {}", err)
}    
Run Code Online (Sandbox Code Playgroud)

这里的相关要求是a中的所有武器match都必须具有相同的结果类型.在这种情况下println!,它会导致(); 除了空块(或其他返回的函数())之外,您只需使用文字:

match io::stdin().read_line(&mut name) {
    Ok(_) => (),
    Err(err) => println!("Could not parse input: {}", err)
}
Run Code Online (Sandbox Code Playgroud)

  • 你可能应该提到`if let Err(err) = io::stdin().read_line(&mut name) { println!("Could not parse input: {}", err); }`。 (2认同)