iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
Web 3

Smart-Contract Language: Move系列 第 21

Day 21 Advanced Topics: Uses and Aliases

  • 分享至 

  • xImage
  •  

use 在 import 篇章我們已經介紹過,這邊我們更詳細介紹和複習各種用法。

這邊用到標準庫的 push_back 函數,使用後將從向量的末尾v就地彈出一個元素並返回擁有的值。v如果為空將中止。標準庫之後會詳細介紹。

native public fun push_back<Element>(v: &mut vector<Element>, e: Element);

schema

use <address>::<module name>;
use <address>::<module name> as <module alias name>;

example

use Std::Vector;
use Std::Vector as V;

fun new_vecs(): (vector<u8>, vector<u8>, vector<u8>) {
    let v1 = Std::Vector::empty();
    let v2 = Vector::empty();
    let v3 = V::empty();
    (v1, v2, v3) // 三種使用方式都一樣效果
}

指定特定 Module 成員(函數、結構或常量),可以這樣使用

use <address>::<module name>::<module member>;
use <address>::<module name>::<module member> as <member alias>;

一次將多個 Module 成員添加別名,可以使用下面語法

// schema
use <address>::<module name>::{<module member>, <module member> as <member alias> ... };

// example
use Std::Vector::{push_back, length as len, pop_back};

fun swap_last_two<T>(v: &mut vector<T>) {
    assert!(len(v) >= 2, 42);
    let last = pop_back(v);
    let second_to_last = pop_back(v);
    push_back(v, last);
    push_back(v, second_to_last)
}

在 Module 內

無論聲明的順序為何,Module 所有 use 都可以使用,不受順序引響。

address 0x42 {
module Example {
    use Std::Vector;

    fun example(): vector<u8> {
        let v = empty();
        Vector::push_back(&mut v, 0);
        Vector::push_back(&mut v, 10);
        v
    }

    use Std::Vector::empty; // 即使宣告在這,在 example 函數內還是可以使用
}
}

在表達式內部

通常會在表達式開頭就添加 use 聲明,在表達式塊結束後將無法再次取用

address 0x42 {
module Example {

    fun example(): vector<u8> {
        use Std::Vector::{empty, push_back};

        let v = empty();
        push_back(&mut v, 0);
        push_back(&mut v, 10);
        v
    }
		let v2 = empty(); // ERROR!
}
}

值得注意是, use 必須是表達式塊中的第一項。否則將出錯。

{
    let x = 0;
    use Std::Vector; // ERROR!
    let v = Vector::empty();
}

命名規則

我們在第一篇章就有介紹過命名,這邊再次複習下,必須使用 a to z 當作別名。

address 0x42 {
module Data {
    struct S {}
    const FLAG: bool = false;
    fun foo() {}
}
module Example {
    use 0x42::Data::{
        S as s, // ERROR!
        FLAG as fLAG, // ERROR!
        foo as FOO,  // valid
        foo as bar, // valid
    };
}
}

獨特性

在給定範圍內,聲明引入的所有別名都use必須是唯一的。

對於一個模塊,這意味著use不能重疊引入的別名

address 0x42 {
module Example {

    use Std::Vector::{empty as foo, length as foo}; // ERROR!
    //                                        ^^^ duplicate 'foo'

    use Std::Vector::empty as bar;

    use Std::Vector::length as bar; // ERROR!
    //                         ^^^ duplicate 'bar'
		

	use 0x42::Data::S;

    struct S { value: u64 } // ERROR!
    //     ^ conflicts with alias 'S' above
}
}

本篇介紹了進階的 use 和別名用法,讓我們 Move to Day 22


上一篇
Day 20 Advanced Topics: Resource part 4
下一篇
Day 22 Advanced Topics: Package
系列文
Smart-Contract Language: Move30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言