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

时间:2016-01-25 13:24:32

标签: 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());
}

给出以下输出:

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

第一个"马库斯"是我进入的。为什么不打印节目"请输入你的姓名"在等待输入之前?

是否可以“什么也不做”#34;如果返回的ResultOk?在示例中,Ok()表示我已将输入保存在变量名称中。太棒了。但在这种情况下我该如何处理Ok() =>

3 个答案:

答案 0 :(得分:11)

print! print!对此进行了解释。由于use std::io::{self, Write}; print!("Please enter your name: "); io::stdout().flush(); 不会发出换行符,并且stdout是行缓冲的,因此您将看不到任何输出。您可以手动刷新标准输出:

Ok(_) => (),

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

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());
}

所以你的程序变成了:

match

正如@Veedrac在其(现已删除)评论中指出的那样,您可以使用documentation代替read_line if let Err(err) = io::stdin().read_line(&mut name) { println!("Could not parse input: {}", err) } 的结果:

class Base {
public:
    virtual void Nothing() {}
};
class MiddleDerived : public Base {
    virtual void Nothing() {}
};
class Derived : public MiddleDerived {
    virtual void Nothing() {}
};

答案 1 :(得分:8)

  

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

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

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

// If you "use" `io::Write`...
io::stdout().flush().expect("flush failed!");
  

此外,如果返回的结果为Ok,是否可以“无所事事”?

不确定。只是......什么都不做。

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

此处的相关要求是match中的所有武器都必须具有相同的结果类型。在println!的情况下,会产生();除了一个空块(或另一个返回()的函数),你可以使用一个文字:

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

答案 2 :(得分:-1)

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

fn main() {
    print!("Please enter your name: ");
    let _ = io::stdout().flush();
    // your io code
}