簡體   English   中英

為什么 Rust 不推斷此閉包的返回類型?

[英]Why does Rust not infer this closure's return type?

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語句而不阻止編譯器推斷其返回類型?

這是因為缺少分號。 如果沒有分號,則返回最后一個表達式,最后一個表達式是return num + 1.0 由於 return 語句使程序跳轉到某個地方,否則它的值可以是任何值,例如:

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

但是,如果編譯器沒有看到直接分配給它的類型,它將選擇 type ()作為 return 語句的值。

所以發生的事情是:

  1. 編譯器看到閉包中的最后一個表達式,並默認為其分配類型()
  2. 然后編譯器在閉包內看到一個顯式返回,它返回類型i32

因此,由於有兩次嘗試從閉包返回,並且它們各自返回不同的類型,所以這是類型不匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM