陳述句和運算式
Rust 的函式體是由一系列陳述句組成,最后由一個運算式來回傳值,例如:
fn add_with_extra(x: i32, y: i32) -> i32 {
let x = x + 1; // 陳述句
let y = y + 5; // 陳述句
x + y // 運算式
}
陳述句會執行一些操作但是不會回傳一個值,而運算式會在求值后回傳一個值,因此在上述函式體的三行代碼中,前兩行是陳述句,最后一行是運算式,
對于 Rust 語言而言,這種基于陳述句和運算式的方式是非常重要的,你需要能明確的區分這兩個概念, 但是對于很多其它語言而言,這兩個往往無需區分,基于運算式是函式式語言的重要特征,運算式總要回傳值,
陳述句
let a = 8;
let b: Vec<f64> = Vec::new();
let (a, c) = ("hi", false);
以上都是陳述句,它們完成了一個具體的操作,但是并沒有回傳值,因此是陳述句,
由于 let 是陳述句,因此不能將 let 陳述句賦值給其它值,如下形式是錯誤的:
let b = (let a = 8);
錯誤如下:
error: expected expression, found statement (`let`) // 期望運算式,卻發現`let`陳述句
--> src/main.rs:2:13
|
2 | let b = let a = 8;
| ^^^^^^^^^
|
= note: variable declaration using `let` is a statement `let`是一條陳述句
error[E0658]: `let` expressions in this position are experimental
// 下面的 `let` 用法目前是試驗性的,在穩定版中尚不能使用
--> src/main.rs:2:13
|
2 | let b = let a = 8;
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: you can write `matches!(<expr>, <pattern>)` instead of `let <pattern> = <expr>`
以上的錯誤告訴我們 let 是陳述句,不是運算式,因此它不回傳值,也就不能給其它變數賦值,但是該錯誤還透漏了一個重要的資訊, let 作為運算式已經是試驗功能了,也許不久的將來,我們在 [stable rust](https://course.rs/appendix/rust-version.html) 下可以這樣使用,
運算式
運算式會進行求值,然后回傳一個值,例如 5 + 6,在求值后,回傳值 11,因此它就是一條運算式,
運算式可以成為陳述句的一部分,例如 let y = 6 中,6 就是一個運算式,它在求值后回傳一個值 6(有些反直覺,但是確實是運算式),
呼叫一個函式是運算式,因為會回傳一個值,呼叫宏也是運算式,用花括號包裹最侄訓傳一個值的陳述句塊也是運算式,總之,能回傳值,它就是運算式:
fn main() {
let y = {
let x = 3;
x + 1
};
println!("The value of y is: {}", y);
}
The value of y is: 4
上面使用一個陳述句塊運算式將值賦給 y 變數,陳述句塊長這樣:
{
let x = 3;
x + 1
}
該陳述句塊是運算式的原因是:它的最后一行是運算式,回傳了 x + 1 的值,注意 x + 1 不能以分號結尾,否則就會從運算式變成陳述句, 運算式不能包含分號,這一點非常重要,一旦你在運算式后加上分號,它就會變成一條陳述句,再也不會回傳一個值,請牢記!
最后,運算式如果不回傳任何值,會隱式地回傳一個 () ,
fn main() {
assert_eq!(ret_unit_type(), ())
}
fn ret_unit_type() {
let x = 1;
// if 陳述句塊也是一個運算式,因此可以用于賦值,也可以直接回傳
if (x > 1) {
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/502628.html
標籤:其他
上一篇:day25--Java集合08
