函數以fun
關鍵字開頭,後跟函數名、參數的括號、返回類型,函數本體。
fun function_name(arg1: u64, arg2: bool): u64 {
// function body
// return type is u64 value
}
Script 只能包含一個被認為是 main 的函數,作為 transaction 執行,且不能返回值
// 檢查地址是否存在的 script 範例
script {
use 0x1::Account;
fun main(addr: address) {
assert(Account::exists(addr), 1);
}
}
可以有一個或多個函數來執行任務
通常會在 Module 定義好 function, 並在 Script 來呼叫使用
// 宣告一個 Math module 並擁有兩個 function
module Math {
public fun sum(a: u64, b: u64): u64 {
a + b // 不需要分號,就像做 Block expression 一樣 (Day 4 介紹)
}
fun zero(): u8 {
0
}
}
// 我們使用 use 關鍵字來 import 欲使用 function 所在的 Module
// use 之後會詳細解釋
script {
use 0x1::Math; // used 0x1 here; 可以是其他地址
fun main(first_num: u64, second_num: u64) {
let sum = Math::sum(first_num, second_num);
}
}
我們可以這樣搭配使用 struct 和 function
module Example {
struct Counter { count: u64 }
fun new_counter(): Counter {
Counter { count: 0 }
}
}
在參數之後,函數指定其返回類型
如沒特別指定將不會返回任何值
fun zero(): u64 { 0 } // 返回類型是 u64
使用元祖可以返回多個值
fun one_two_three(): (u64, u64, u64) { (0, 1, 2) }
函數的返回值是序列中的最後一個數值
fun example(): u64 {
let x = 0;
x = x + 1;
x // returns 'x'
}
fun double_and_add(x: u64, y: u64): u64 {
let double_x = x * 2;
let double_y = y * 2;
double_x + double_y // return double_x + double_y
}
有些函數是 VM 直接提供的,會被標記 native
module Std::Vector {
native public fun empty<Element>(): vector<Element>;
...
}
默認情況下, module 中定義的每個函數都是 private
的,不能在其他 module 和 script 中訪問
module Math {
// public
public fun sum(a: u64, b: u64): u64 {
a + b
}
// private
fun zero(): u8 {
0
}
}
可以創建私有函數還完成一些內部工作
module Math {
public fun is_zero(a: u8): bool {
a == zero() // 直接調用 zero 函數
}
fun zero(): u8 {
0
}
}
需特別注意函數在 Module 和 Script 中的不同表現方式,以及 return 的使用。
讓我們 Move to Day7