簡體   English   中英

為什么返回不能推斷返回的類型,而我必須顯式返回而不是使用閉包?

[英]Why can't returns infer the type of the return, and I have to explicitly return instead of using closures?

我在做基本練習:

pub fn bigger(a: i32, b: i32) -> i32 {
    let biggest = if a > b { a } else { return b };
}

編譯器報錯:

error[E0308]: mismatched types
 --> src/lib.rs:1:34
  |
1 | pub fn bigger(a: i32, b: i32) -> i32 {
  |        ------                    ^^^ expected `i32`, found `()`
  |        |
  |        implicitly returns `()` as its body has no tail or `return` expression

我不明白為什么編譯器會找到() 據我了解,由於閉包在biggest返回ab ,我是否應該更改代碼(例如,在后面添加最大的行,或最大;或者基本上返回 a 或 b)。

問題出在哪兒? 如果我通過添加一行返回biggest ,它會按預期編譯。 為什么編譯器無法推斷返回類型?

let返回一些東西嗎? 我知道我錯過了一些東西,但似乎明白了什么。

這里的目標是了解 Rust 正在做什么,因為我覺得我無法掌握一些概念並且沒有最好的代碼。

讓我們了解您的代碼以更清楚地了解會發生什么。

pub fn bigger(a: i32, b: i32) -> i32 {
    let biggest = if a > b { a } else { return b };
}

您正在創建一個本地范圍的名為結合biggest 如果a > b則其價值a ,否則該函數將return b

所以對於a > b這個函數沒有隱式或顯式的返回值。

在這個函數中,不需要顯式命名的biggest綁定。 您可以使用 Rust 的隱式返回屬性:

pub fn bigger(a: i32, b: i32) -> i32 {
    if a > b {
        a
    } else {
        b
    }
}

我應該提到這個函數相當於標准庫中的std::cmp::max

對內聯答案的補充:

為什么編譯器無法推斷返回類型?

它不是。 它告訴您您的類型不匹配:您聲明bigger返回i32但它沒有。

let返回一些東西嗎?

不, let聲明let

我知道我錯過了一些東西,但似乎明白了什么。

let做它的事。 由於之后什么都沒有,執行“脫離”了函數的末尾,它不返回任何東西,因此隱式返回() (正是編譯器告訴你的)。

由於這與聲明的i32返回類型不匹配,您會收到編譯錯誤。

暫無
暫無

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

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