2014-10-30 112 views
10

由於分號顯然是可選的拉斯特,爲什麼,如果我這樣做:分號在Rust中是否可選?

fn fn1() -> i32 {  
    let a = 1 
    let b = 2 
    3 
} 

我得到的錯誤:

error: expected one of `.`, `;`, `?`, or an operator, found `let` 
--> src/main.rs:3:9 
    | 
2 |   let a = 1 
    |     - expected one of `.`, `;`, `?`, or an operator here 
3 |   let b = 2 
    |   ^^^ unexpected token 

回答

39

它們不是可選的。分號修改表達式語句的行爲,因此它應該是一個有意識的決定,無論您是否使用它們作爲一行代碼。

Rust中的幾乎所有東西都是表達式。表達式是返回值的東西。如果你輸入一個分號,你就會壓制這個表達式的結果,這在大多數情況下是你想要的。

另一方面,這意味着如果以不帶分號的表達式結束函數,則會返回最後一個表達式的結果。 match語句中的塊可以應用同樣的方法。

你可以在任何其他地方使用沒有分號的表達式。

例如:

let a = { 
    let inner = 2; 
    inner * inner 
}; 

這裏表達inner * inner不以分號結束,所以不被抑制它的值。由於它是塊中的最後一個表達式,因此它的值將被返回並分配給a。如果在同一行上放置分號,則不會返回inner * inner的值。

在你的具體情況下,不要壓制你的let語句的值沒有意義,編譯器會正確地給你一個錯誤。實際上,let不是一個表達式。

+0

您也可以查看https://rustbyexample.com/expression.html關於也提到分號的表達式。 – nbro 2018-02-11 21:52:14

相關問題