iT邦幫忙

2022 iThome 鐵人賽

DAY 5
1
Web 3

Smart-Contract Language: Move系列 第 6

Day 6 Function

  • 分享至 

  • xImage
  •  

函數以fun關鍵字開頭,後跟函數名、參數的括號、返回類型,函數本體。

fun function_name(arg1: u64, arg2: bool): u64 {
    // function body
        // return type is u64 value
}

函數在 Script 中

Script 只能包含一個被認為是 main 的函數,作為 transaction 執行,且不能返回值

// 檢查地址是否存在的 script 範例
script {
    use 0x1::Account;

    fun main(addr: address) {
        assert(Account::exists(addr), 1);
    }
}

函數在 Module 中

可以有一個或多個函數來執行任務

通常會在 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

我們可以這樣搭配使用 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


上一篇
Day 5 Constants & Import
下一篇
Day 7 Control Flow
系列文
Smart-Contract Language: Move30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言