我试图创建一个从stdin获取输入的方法。它应该循环,直到输入是一个有效的整数,我可以解析为整数。我得到的错误是这样的:
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
| ++++++++++++++
字符串
我认为match语句是错误的,但我不知道我应该如何解决它。我只是想抓住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
}
型
2条答案
按热度按时间bkhjykvo1#
您的代码在顶部声明
let mut parsed_int
并在底部返回它,但循环中的let parsed_int = ...
隐藏了外部变量。它实际上并没有赋值给外部parsed_int
,这可以防止Rust推断内部parsed_int
是i32
。实际上,你并不需要一个
parsed_int
变量。你可以使用break integer
来使循环计算为integer
。由于循环是函数中的最后一个表达式,这将使函数实际上返回integer
。然后Rust能够推断integer
是i32
。字符串
Playground
z9smfwbn2#
str::parse
定义为:字符串
你需要告诉编译器你想调用
parse
的类型。你可以这样写:型