[英]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
返回a
或b
,我是否應該更改代碼(例如,在后面添加最大的行,或最大;或者基本上返回 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.