我正在try 创建一个从标准输入中获取输入的方法.它应该循环,直到输入是有效的整数,我可以将其解析为整数.我收到的错误是:

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(),并再次try ,直到结果值是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
}

推荐答案

你的代码在顶部声明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

Rust相关问答推荐

在Tauri中获取ICoreWebView 2_7以打印PDF

如何优化小型固定大小数组中的搜索?

如何修复数组中NewType导致的运行时开销

`Pin`有没有不涉及不安全代码的目的?

无符号整数的Rust带符号差

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

关于使用平面图功能的borrow 判断器的问题

借来的价值生命周期 不够长,不确定为什么它仍然是借来的

可选包装枚举的反序列化

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

通过mem::transmute将数组展平安全吗?

Rust中是否可以在不复制的情况下从另一个不可变向量创建不可变向量?

为什么 for_each 在释放模式(cargo run -r)下比 for 循环快得多?

为什么传递 option.as_ref 的行为不同于使用匹配块并将内部映射到 ref 自己?

当 T 不是副本时,为什么取消引用 Box 不会抱怨移出共享引用?

使用部分键从 Hashmap 中检索值

从 Cranelift 发出 ASM

如何重写这个通用参数?

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?

list 中没有指定目标 - 必须存在 src/lib.rs、src/main.rs、[lib] 部分或 [[bin]] 部分