首页 > 解决方案 > 为什么 Rust 不推断这个闭包的返回类型?

问题描述

Rust 编译器通常能够推断从闭包返回的表达式的类型:

fn main() {
    let a_closure = |num|{
        num+1.0
    };
    println!("{}", a_closure(1.0));
}

但是当我使用return语句定义相同的闭包时,编译器无法推断类型:

fn main() {
    let a_closure = |num|{
        return num+1.0
    };
    println!("{}", a_closure(1.0));
}

/*
    error[E0308]: mismatched types
     --> src/main.rs:3:9
      |
    3 |         return num+1.0
      |         ^^^^^^^^^^^^^^ expected `()`, found `f64`
*/

我很惊讶 Rust 不能在这里推断类型:是否可以return在闭包中使用语句而不阻止编译器推断其返回类型?

标签: rusttype-inference

解决方案


这是由于缺少分号。如果没有分号,则返回最后一个表达式,最后一个表达式是return num + 1.0. 由于 return 语句使程序跳转到某个地方,否则它的值可以是任何值,例如:

fn main() {
    let a: String = return;
}

但是,如果编译器没有看到直接分配给它的类型,它将选择该类型()作为 return 语句的值。

所以发生的事情是:

  1. 编译器看到闭包中的最后一个表达式,并()默认为其分配类型。
  2. 然后编译器会在闭包内看到一个显式的 return,它返回 type i32

因此,由于有两次尝试从闭包返回,并且它们各自返回不同的类型,所以这是类型不匹配。


推荐阅读