首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Rust没有推断出这个闭包的返回类型?

为什么Rust没有推断出这个闭包的返回类型?
EN

Stack Overflow用户
提问于 2021-01-15 05:13:28
回答 1查看 317关注 0票数 4

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

代码语言:javascript
复制
fn main() {
    let a_closure = |num|{
        num+1.0
    };
    println!("{}", a_closure(1.0));
}

但是,当我定义相同的闭包using a return statement时,编译器无法推断类型

代码语言:javascript
复制
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语句而不阻止编译器推断它的返回类型?

EN

回答 1

Stack Overflow用户

发布于 2021-01-15 18:21:28

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

代码语言:javascript
复制
fn main() {
    let a: String = return;
}

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

所以发生的事情是:

  1. 编译器会看到闭包中的最后一个表达式,并在缺省情况下为其分配类型()
  2. 编译器随后会在闭包中看到一个显式返回,它会返回类型()

因此,由于有两次尝试从闭包返回,并且每次都返回不同的类型,所以这是一个类型不匹配。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65726999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档