iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
Web 3

Smart-Contract Language: Move系列 第 24

Day 24 Advanced Topics: Standard Library

  • 分享至 

  • xImage
  •  

Move 標準庫公開了實現以下功能的接口:

  • 向量的基本操作
  • 選項類型和對Option類型的操作。
  • 中止代碼的常見錯誤編碼代碼接口
  • 32 位精度定點數

我們每一個來看一下,並舉幾個常見的 API

向量

Vector 模塊定義了對原始 vector 類型的許多操作,該模塊在命名地址下發布 std,由許多本地函數以及 Move 中定義的函數組成。

example

  1. 創建一個空的vectorElement類型既可以是resource 或是 copyable 類型
native public fun empty<Element>(): vector<Element>;
  1. 創建一個包含傳入的長度向量element
public fun singleton<Element>(e: Element): vector<Element>;
  1. 銷毀(解除分配)向量vv如果為非空, 將中止
native public fun destroy_empty<Element>(v: vector<Element>);
  1. e 元素推到 vector 的末尾。可能會觸發基礎向量內存的調整大小
native public fun push_back<Element>(v: &mut vector<Element>, e: Element);
  1. 從向量的末尾v就地彈出一個元素並返回擁有的值。v如果為空將中止。 (我們在前幾篇有看過這用法)
native public fun pop_back<Element>(v: &mut vector<Element>): Element;

選項

Option模塊定義了一個通用選項類型Option<T>,它表示T可能存在或不存在的類型值。它在命名地址下發布Std

Move 選項類型在內部表示為單例向量,並且可能包含值resourcecopyable種類。

example

類型

可能存在或不存在的值的通用類型抽象。可以包含 anyresourcecopyablekind 的值

struct Option<T>;

example

  1. 創建一個空Option的,可以包含一個Element類型的值
public fun none<Element>(): Option<Element>;
  1. 創建一個非 Option type 且包含一個 type 是 Element 的 value e
public fun some<Element>(e: T): Option<Element>;
  1. 如果opt_elem不包含值,則返回對選項opt_elem 的不可變引用將中止
public fun borrow<Element>(opt_elem: &Option<Element>): &Element;
  1. 如果 opt_elem 包含值,則返回對內部值的引用。如果 opt_elem不包含值,default_ref則將返回傳入的引用,不會中止
public fun borrow_with_default<Element>(opt_elem: &Option<Element>, default_ref: &Element): &Element;
  1. 將空選項 opt_elem 轉換為包含 value 的 opt_elem 選項值eopt_elem如果已經包含一個值,將中止
public fun fill<Element>(opt_elem: &mut Option<Element>, e: Element);

錯誤

Move 中的每個中止代碼都表示為一個無符號的 64 位整數。該Errors模塊定義了一個通用接口,可用於“標記”這些中止代碼中的每一個,以便它們可以表示錯誤類別和錯誤原因

錯誤類別在模塊中被聲明為常量,Errors並且相對於該模塊是全局唯一。同時,錯誤原因是特定於模塊的錯誤代碼,並且可以提供有關特定錯誤條件的更多詳細信息(甚至可能是特定原因)

中止代碼的低 8 位保存錯誤類別。中止代碼的其餘 56 位保存錯誤原因。原因應該是相對於引發錯誤的模塊的唯一編號,並且可用於獲取有關手頭錯誤的更多信息。它應該主要用於診斷目的,因為如果更新模塊,錯誤原因可能會隨著時間而改變。

Error 的公共函數會帶有特定的 reason 數字 (標示為 a u64)

example

  1. 系統處於不允許執行的操作的狀態
const INVALID_STATE: u8 = 1;
  1. 執行操作需要特定的帳戶地址,但遇到了與預期不同的地址
const REQUIRES_ADDRESS: u8 = 2;
  1. 帳戶沒有此操作的預期角色。對於基於角色的訪問控制 (RBAC) 錯誤情況很有用。
const REQUIRES_ROLE: u8 = 3;
  1. 帳戶沒有所需的功能。對於 RBAC 錯誤情況很有用。
const REQUIRES_CAPABILITY: u8 = 4;
  1. 應有資源,但地址下不存在。
const NOT_PUBLISHED: u8 = 5;

功能

  1. 應該在遇到無效(全局)狀態的情況下使用。構造一個帶有指定reason和類別的中止代碼INVALID_STATEreason如果不適合 56 位,將中止。
public fun invalid_state(reason: u64): u64;
  1. 如果帳戶的地址與特定地址不匹配,則應使用。構造一個帶有指定reason和類別的中止代碼REQUIRES_ADDRESSreason如果不適合 56 位,將中止。
public fun requires_address(reason: u64): u64;
  1. 如果資源在預期的地方不存在,則應使用該資源。構造一個帶有指定reason和類別的中止代碼NOT_PUBLISHEDreason如果不適合 56 位,將中止。
public fun not_published(reason: u64): u64;

本篇主要介紹了 Move 提供的本地標準庫用法,基本上用久就可以提昇整體掌握度。讓我們 Move to Day 25


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

尚未有邦友留言

立即登入留言