Skip to main content

函式 (Functions)

函式是 Move 程式的建構模組。它們從 使用者交易以及其他函式中被呼叫,並將可執行程式碼分組成可重複使用的單元。函式可以接收引數並回傳一個值。它們是以 fun 關鍵字在模組層級宣告的。就像其他任何模組成員一樣,預設情況下 它們是私有的,只能從模組內部存取;讓它們對其他 模組可見是可見性修飾詞 (Visibility Modifiers)章節的主題,將在本章稍後介紹。

module book::math;

#[test_only]
use std::unit_test::assert_eq;

/// Function takes two arguments of type `u64` and returns their sum.
/// The `public` visibility modifier makes the function accessible from
/// outside the module.
public fun add(a: u64, b: u64): u64 {
a + b
}

#[test]
fun test_add() {
let sum = add(1, 2);
assert_eq!(sum, 3);
}

在這個範例中,我們定義了一個函式 add,它接收兩個 u64 型別的引數並回傳它們的 總和。位於同一模組中的 test_add 函式是一個測試函式,它呼叫 add。這個 測試使用 assert_eq! 巨集來比較 add 的結果與預期值。如果 兩個值不同,執行會自動中止。

函式宣告 (Function Declaration)

在 Move 中,函式通常使用 snake_case 慣例命名。這代表函式 名稱應全部小寫,單字之間以底線分隔。範例包括 do_somethingaddget_balanceis_authorized 等等。

函式是以 fun 關鍵字宣告,後面接著函式名稱(一個有效的 Move 識別字)、括號中的引數清單,以及一個回傳型別。函式主體是一個 區塊 (block),而且就像任何區塊一樣,最後一個沒有分號的運算式就是 函式的回傳值。return 關鍵字允許提前回傳——這會在其他 控制流程 (control flow)運算式中一併說明。

fun return_nothing() {
// empty expression, function returns `()`
}

存取函式 (Accessing Functions)

就像其他模組成員一樣,函式可以使用路徑匯入並存取。路徑 由模組路徑和函式名稱組成,以 :: 分隔。例如,如果你在 book 套件中的 math 模組裡有一個名為 add 的函式,它的完整路徑會是 book::math::add。如果模組已經被匯入——匯入在 匯入模組 (Importing Modules)章節中有說明——你可以直接以 math::add 存取它,如同 以下範例:

module book::use_math;

use book::math;

fun call_add() {
// function is called via the path
let sum = math::add(1, 2);
}

多重回傳值 (Multiple Return Values)

Move 函式可以回傳多個值,當你需要從一個函式回傳 不只一項資料時,這特別有用。回傳型別以型別的元組(tuple)指定,而 回傳值則以運算式的元組提供:

fun get_name_and_age(): (vector<u8>, u8) {
("John", 25)
}

具有元組回傳的函式呼叫結果,必須透過 let (tuple) 語法解構到變數中:

// Tuple must be destructured to access its elements.
// Name and age are declared as immutable variables.
let (name, age) = get_name_and_age();
assert_eq!(name, "John");
assert_eq!(age, 25);

如果任何已宣告的值需要宣告為可變的,mut 關鍵字要放在 變數名稱之前:

// declare name as mutable, age as immutable
let (mut name, age) = get_name_and_age();

如果有些回傳值不需要使用,可以用 _ 符號忽略它們:

// ignore the name, only use the age
let (_, age) = get_name_and_age();

延伸閱讀 (Further Reading)