你可以调用str::parse()
,但要确保read_line
正常工作。我们需要一个读取器:
use std::io;
fn main() {
let reader = io::stdin();
}
stdin
读取处理输入流的全局缓冲区,并实现
BufRead
特质,其中包括
read_line
方法。该方法需要一个可变的
String
类型的输入缓冲区,读取流中的所有字节,直到遇到换行符并将它们添加到缓冲区中。
#expect()
方法解包结果;如果是
Err
则会带有消息和原因而导致程序崩溃。
use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
}
现在我们有了要转换为 i32
的输入文本。只要我们给出要解析的类型,str::parse()
就能为我们工作。必须使用 str::trim()
,因为 read_line
包括缓冲区中的换行字节。
use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
let input = input_text.trim().parse::<i32>();
}
我们还没有完成,我们仍然需要确保使用模式匹配成功解析输入。将原始输入缓冲区转换为可用整数的所有代码如下:
use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
let input_opt = input_text.trim().parse::<i32>();
let input_int = match input_opt {
Ok(input_int) => input_int,
Err(e) => {
println!("please input a number ({})", e);
return;
}
};
println!("{}", input_int);
}
这个编译没有错误或警告。
old_io
模块,该模块在 Rust 1.0 中已不再可用;因此此答案已经失效。 - Shepmaster