变量需要来自 parse() 的显式类型

HWi*_*mer 2 rust

我正在尝试创建一个从标准输入获取输入的方法。它应该循环,直到输入是我可以解析为整数的有效整数。我收到的错误是这样的:

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)

Joh*_*ica 5

您的代码在顶部声明let mut parsed_int并在底部返回它,但let parsed_int = ...在循环中隐藏了外部变量。它实际上并没有分配给外部parsed_int,这阻止了 Rust 推断内部parsed_inti32

事实上,您实际上并不需要parsed_int变量。您可以使用break integer使循环计算为integer。由于循环是函数中的最后一个表达式,这将导致函数有效地返回integer。Rust 然后能够推断出integeri32

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)

操场