iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
Web 3

Smart-Contract Language: Move系列 第 19

Day 19 Advanced Topics: Resource part 3

  • 分享至 

  • xImage
  •  

讀取和修改資源 Move 還有兩個內置函數:borrow_globalborrow_global_mut

不可變借用 borrow_global

在 ownership 篇章中,我們介紹了可變 (&mut)、不可變 (&) 引用,我們來應用在實際範例:

// modules/Collection.move
module Collection {

    // added a dependency here!
    use 0x1::Signer;
    use 0x1::Vector;

    struct Item has store, drop {}
    struct Collection has key, store {
        items: vector<Item>
    }

    // 拿到 Collection size
		// 這邊用到了 acquires
    public fun size(account: &signer): u64 acquires Collection {
        let owner = Signer::address_of(account);
        let collection = borrow_global<Collection>(owner);

        Vector::length(&collection.items)
    }
}

borrow_global 提供對資源 T 的不可變引用,schema 如下:

native fun borrow_global<T: key>(addr: address): &T;

通過上面範例,我們可以讀取儲存在特定地址的資源,但由於使用 borrow_global 無法返回對資源的引用或其內容

獲取 acquires

關鍵字acquires放在函數返回值之後。此關鍵字明確定義此函數獲取的所有資源。

schema

fun <name>(<args...>): <ret_type> acquires T, T1 ... {

可變借用 borrow_global_mut

要獲得對資源的可變引用,只需添加mutborrow_global即可。

對資源的可變引用允許創建對其內容的可變引用。

module Collection {

    // ... skipped ...

    public fun add_item(account: &signer) acquires T {
        let collection = borrow_global_mut<T>(Signer::address_of(account));

        Vector::push_back(&mut collection.items, Item {});
    }
}

讓我們 Move to Day 20


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

尚未有邦友留言

立即登入留言