Skip to main content

運算式 (Expression)

在程式語言中,運算式是回傳一個值的程式碼單元。在 Move 中,幾乎所有東西都是運算式,唯一的例外是 let 陳述式,它是一個宣告。在本節中,我們將介紹運算式的種類,並引入作用域(scope)的概念。

運算式以分號 ; 分隔。如果分號後面「沒有運算式」,編譯器會插入一個 unit () —— 代表空運算式的值。

字面值 (Literals)

基本型別一節中,我們介紹了 Move 的基本型別。而為了說明它們,我們使用了字面值。字面值是一種在原始碼中表示固定值的表示法。字面值可以用來初始化變數,或直接將固定值作為引數傳遞給函式。Move 有以下幾種字面值:

  • 布林值:truefalse
  • 整數值:01123123
  • 十六進位值:以 0x 為前綴的數字,用來表示整數,例如 0x00x10x123
  • 位元組向量值:以 b 為前綴,例如 b"bytes_vector"
  • 位元組值:以 x 為前綴的十六進位字面值,例如 x"0A"
  • 字串值:以雙引號括住的文字,例如 "hello"。與其他字面值不同的是,字串字面值的型別是由上下文推斷出來的 —— 它可以是 vector<u8> 或兩種標準字串型別之一。字串會在字串一節中詳細介紹。
let b = true; // true is a literal
let n = 1000; // 1000 is a literal
let h = 0x0A; // 0x0A is a literal
let v = b"hello"; // b"hello" is a byte vector literal
let x = x"0A"; // x"0A" is a byte vector literal
let c = vector[1, 2, 3]; // vector[] is a vector literal
let s: std::string::String = "hello"; // "hello" is a string literal

運算子 (Operators)

算術、邏輯與位元運算子用來對值執行運算。由於這些運算會產生值,因此它們被視為運算式。整數運算子——以及它們會在何時中止(abort)——列在基本型別一節中。

let sum = 1 + 2; // 1 + 2 is an expression
let sum = (1 + 2); // the same expression with parentheses
let is_true = true && false; // true && false is an expression
let is_true = (true && false); // the same expression with parentheses

區塊 (Blocks)

區塊是由大括號 {} 包住的一系列陳述式與運算式。它會回傳區塊中最後一個運算式的值(注意,這個最終的運算式不能有結尾分號)。區塊是一種運算式,因此它可以用在任何需要運算式的地方。

// block with an empty expression, however, the compiler will
// insert an empty expression automatically: `let none = { () }`
// let none = {};

// block with let statements and an expression.
let sum = {
let a = 1;
let b = 2;
a + b // last expression is the value of the block
};

// block is an expression, so it can be used in an expression and
// doesn't have to be assigned to a variable.
{
let a = 1;
let b = 2;
a + b; // not returned - semicolon.
// compiler automatically inserts an empty expression `()`
};

區塊同時也劃定了_作用域_(scope):在區塊內宣告的變數,只存在到該區塊的結尾大括號為止。當作用域結束時,值究竟會發生什麼事,是 Move 中一個重要的問題,所有權與作用域一節就是專門討論這個主題。

函式呼叫 (Function Calls)

我們會在緊接著的下一節——函式——中詳細介紹函式。這裡只需要說明的是,函式呼叫是一種運算式:它會呼叫一個函式,並回傳該函式主體中最後一個運算式的值,前提是該最後一個運算式沒有結尾分號。

fun add(a: u8, b: u8): u8 {
a + b
}

#[test]
fun some_other() {
let sum = add(1, 2); // not returned due to the semicolon.
// compiler automatically inserts an empty expression `()` as return value of the block
}

控制流程運算式 (Control Flow Expressions)

控制流程運算式用來控制程式的執行流程。它們同樣也是運算式,因此會回傳一個值。我們會在控制流程一節中介紹控制流程運算式。以下是一個非常簡短的概覽:

// if is an expression, so it returns a value; if there are 2 branches,
// the types of the branches must match.
if (bool_expr) expr1 else expr2;

// while is an expression, but it returns `()`.
while (bool_expr) { expr; };

// loop is an expression, but returns `()` as well.
loop { expr; break };

延伸閱讀 (Further Reading)