rust 变量需要parse()中的显式类型

ev7lccsx  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(117)

我试图创建一个从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
}

bkhjykvo

bkhjykvo1#

您的代码在顶部声明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:"),
        }
    }
}

字符串
Playground

z9smfwbn

z9smfwbn2#

str::parse定义为:

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err>
where
    F: FromStr

字符串
你需要告诉编译器你想调用parse的类型。你可以这样写:

let parsed_int_result: Result<i32, _> = line.trim().parse();

相关问题