我正在尝试创建一个从标准输入获取输入的方法。它应该循环,直到输入是我可以解析为整数的有效整数。我收到的错误是这样的:
error[E0282]: type annotations needed for `Result<F, _>`
--> src/lib.rs:9:13
|
9 | let parsed_int_result = line.trim().parse(); // Getting the error here
| ^^^^^^^^^^^^^^^^^
|
help: consider giving `parsed_int_result` an explicit type, where the placeholders `_` are specified
|
9 | let parsed_int_result: Result<F, _> = line.trim().parse(); // Getting the error here
| ++++++++++++++
Run Code Online (Sandbox Code Playgroud)
我认为匹配语句有点错误,但我不知道应该如何解决。我只想捕获并重Err()试,直到结果值为Ok()。
pub fn input_int_with_message(msg: &str) -> i32 {
let mut parsed_int;
println!("{msg}");
loop {
let mut line = String::new();
std::io::stdin()
.read_line(&mut line)
.expect("Couldn't read from stdin");
let parsed_int_result = line.trim().parse(); // Getting the error here
let parsed_int = match parsed_int_result {
Ok(integer) => {
integer;
break;
},
Err(error) => println!("Input was not an integer. Try again:"),
};
}
parsed_int
}
Run Code Online (Sandbox Code Playgroud)
您的代码在顶部声明let mut parsed_int并在底部返回它,但let parsed_int = ...在循环中隐藏了外部变量。它实际上并没有分配给外部parsed_int,这阻止了 Rust 推断内部parsed_int是i32。
事实上,您实际上并不需要parsed_int变量。您可以使用break integer使循环计算为integer。由于循环是函数中的最后一个表达式,这将导致函数有效地返回integer。Rust 然后能够推断出integer是i32。
pub fn input_int_with_message(msg: &str) -> i32 {
println!("{msg}");
loop {
let mut line = String::new();
std::io::stdin()
.read_line(&mut line)
.expect("Couldn't read from stdin");
let parsed_int_result = line.trim().parse(); // Getting the error here
match parsed_int_result {
Ok(integer) => {
break integer;
}
Err(_) => println!("Input was not an integer. Try again:"),
}
}
}
Run Code Online (Sandbox Code Playgroud)