語句和表達式
rust是一個基於表達式的語言,不過它也有語句。rust只有兩種語句:聲明語句和表達式語句,其他的都是表達式。基於表達式是函數式語言的一個重要特徵,表達式總是返回值。
聲明語句
rust的聲明語句可以分為兩種,一種為變量聲明語句,另一種為Item聲明語句。
變量聲明語句。主要是指
let
語句,如:let a = 8; let b: Vec<f64> = Vec::new(); let (a, c) = ("hi", false);
由於let是語句,所以不能將let語句賦給其他值。如下形式是錯誤的:
let b = (let a = 8);
rustc編譯器會給出錯誤信息:
Item聲明。是指函數(function)、結構體(structure)、類型別名(type)、靜態變量(static)、特質(trait)、實現(implementation)或模塊(module)的聲明。這些聲明可以嵌套在任意塊(block)中。關於Item聲明,Rust Reference中的描述如下:
An item declaration statement has a syntactic form identical to an item declaration within a module. Declaring an item — a function, enumeration, structure, type, static, trait, implementation or module — locally within a statement block is simply a way of restricting its scope to a narrow region containing all of its uses; it is otherwise identical in meaning to declaring the item outside the statement block.
當然,這裡不能展開講這些Item都是如何聲明的,詳情請看RustPrimer的其他相關章節。
表達式語句
表達式語句,由一個表達式和一個分號組成,即在表達式後面加一個分號就將一個表達式轉變為了一個語句。所以,有多少種表達式,就有多少種表達式語句。
rust有許多種表達式:
字面表達式(literal expression)
(); // unit type "hello"; // string type '1'; // character type 15; // integer type
元組表達式(Tuple expression):
(0.0, 4.5); ("a", 4usize, true);
通常不使用一個元素的元組,不過如果你堅持的話,rust也是允許的,不過需要在元素後加一個逗號:
(0,); // single-element tuple (0); // zero in parentheses
結構體表達式(structure expression) 由於結構體有多種形式,所以結構體表達式也有多種形式。
Point {x: 10.0, y: 20.0}; TuplePoint(10.0, 20.0); let u = game::User {name: "Joe", age: 35, score: 100_000}; some_fn::<Cookie>(Cookie);
結構體表達式一般用於構造一個結構體對象,它除了以上從零構建的形式外,還可以在另一個對象的基礎上進行構建:
let base = Point3d {x: 1, y: 2, z: 3}; Point3d {y: 0, z: 10, .. base};
塊表達式(block expression): 塊表達式就是用花括號
{}
括起來的一組表達式的集合,表達式間一般以分號分隔。塊表達式的值,就是最後一個表達式的值。let x: i32 = { println!("Hello."); 5 };
如果以語句結尾,則塊表達式的值為
()
:let x: () = { println!("Hello."); };
範圍表達式(range expression): 可以使用範圍操作符
..
來構建範圍對象(variant ofstd::ops::Range
):1..2; // std::ops::Range 3..; // std::ops::RangeFrom ..4; // std::ops::RangeTo ..; // std::ops::RangeFull
if表達式(if expression):
let a = 9; let b = if a%2 == 0 {"even"} else {"odd"};
除了以上這些外,還有許多,如:
- path expression
- mehond-call expression
- field expression
- array expression
- index expression
- unary operator expression
- binary operator expression
- return expression
- grouped expression
- match expression
- if expression
- lambda expression
- ... ...
這裡無法詳細展開,讀者可以到Rust Reference去查看。
以上表達式語句中的部分例子引用自Rust Reference