我在使用一些基本的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;如果返回的Result
是Ok
?在示例中,Ok()
表示我已将输入保存在变量名称中。太棒了。但在这种情况下我该如何处理Ok() =>
?
答案 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
}