Rust是基於表達式的語言

Rust是基於表達式的語言,幾乎所有代碼都可以看作是表達式。

表達式計算後有返回值,例如3+4是一個表達式,它返回計算結果7。

與表達式對應的概念是語句,語句沒有返回值或者不關心其返回值。例如Rust中變量賦值的代碼let a=3;是語句。

在Rust中,可以在表達式結尾加上分號;來將表達式轉換為【語句】。例如:

fn main(){
  3 + 4;
}

編譯器發現表達式後有分號結尾時,在編譯期間會自動修改代碼,它會在分號的後面加上一個小括號()單獨的小括號是一個特殊的值,表示什麼也不做

所以,以上代碼實際上等價於:

fn main(){
  3+4;()
}

帶有分號表示這是一行Rust代碼,Rust會先執行3+4得到7,然後忽略或丟棄該表達式的返回值7,再然後執行下一行代碼,即一個單獨的小括號,小括號表示什麼也不做,直接跳過。

所以,代碼3+4;從原本的表達式轉變成了不關心返回值的【語句】。

除了在表達式尾部加分號的代碼是語句之外,還有另外一種情況的代碼是語句而非表達式:用於聲明或定義的代碼都是語句。例如let聲明變量、fn定義函數、struct聲明結構體等。

Rust很多地方都會結合表達式和語句來做變量賦值。例如,if結構也是一個表達式,所以它有返回值,可以將if的返回值賦值給變量,而它的返回值來自於它的大括號:當大括號最後執行的一條代碼不加分號結尾時,該代碼的計算結果就是if結構的返回值

例如:


#![allow(unused)]
fn main() {
let x = if true {
  println!("true");
  33     // 分支的最後一條代碼計算結果賦值給x,不能分號結尾
} else {
  println!("false");
  44     // 分支的最後一條代碼計算結果賦值給x,不能分號結尾
}; // 這個結尾分號表示let語句的結尾分號
}

上面的else分支不能缺少,不能缺少else的原因留待後面的章節再解釋。