一種在 Script 和 Module 中共享靜態值的方法,必須在編譯時就確認值,該值存在編譯的 Module or Script 中 (無法使用 public)。每次使用該常量時,都會複製一份去使用
常量聲明以const
關鍵字開頭,後跟名稱、類型和值。它們可以存在於 Script 或 Module 中
const <name>: <type> = <expression>;
script {
const MY_ERROR_CODE: u64 = 0;
fun main(input: u64) {
...
}
}
address 0x42 {
module Example {
const MY_ADDRESS: address = @0x42;
public fun permissioned(s: &signer) {
...
}
}
}
目前只支援原始類型 bool, u8, u64, u128, address, vector<u8>
除了常用的文字,常量還可以包含更複雜的表達式,只要編譯器能夠在編譯時將表達式簡化為一個值即可
const RULE: bool = true && false;
const CAP: u64 = 10 * 100 + 1;
const SHIFTY: u8 = {
(1 << 1) * (1 << 2) * (1 << 3) * (1 << 4)
};
const HALF_MAX: u128 = 340282366920938463463374607431768211455 / 2;
const EQUAL: bool = 1 == 1;
可以導入公開的 Module 或標準庫來使用,關鍵字是 use
// <Address>是發布者的地址,<ModuleName>是 Module 的名稱。
use <Address>::<ModuleName>;
要訪問導入 module 的方法(或類型),請使用::
符號。就這麼簡單 - 只能有一個級別的定義,因此在 Module 中定義的所有內容(公開)都可以通過雙冒號訪問。
script {
use 0x1::Vector;
fun main() {
// here we use method empty() of module Vector
// the same way we'd access any other method of any other module
let _ = Vector::empty<u64>();
}
}
必須放在 Script {}
塊內
script {
use 0x1::Vector;
// in just the same way you can import any
// other module(s). as many as you want!
fun main() {
let _ = Vector::empty<u64>();
}
}
必須在module {}
塊內
module Math {
use 0x1::Vector;
// the same way as in scripts
// you are free to import any number of modules
public fun empty_vec(): vector<u64> {
Vector::empty<u64>();
}
}
導入時可以擴展,指定想要使用的成員
script {
// single member import
use 0x1::Signer::address_of;
// multi member import
use 0x1::Vector::{
empty,
push_back
};
fun main(acc: &signer) {
// use functions without module access
let vec = empty<u8>();
push_back(&mut vec, 10);
// same here
let _ = address_of(acc);
}
}
script {
use 0x1::Vector::{
Self, // Self == Imported module
empty
};
fun main() {
// `empty` imported as `empty`
let vec = empty<u8>();
// Self means Vector
Vector::push_back(&mut vec, 10);
}
}
當有命名衝突發生時,可以使用 as
來更改導入模塊的名字
use <Address>::<ModuleName> as <Alias>;
script {
use 0x1::Vector as V; // V now means Vector
fun main() {
V::empty<u64>();
}
}
我們複習一下到目前為止介紹的內容
Script: function 執行進入點
naming:lower snake case
,與 file 內 function 名字一樣
Module: 定義 struct type 和對這些資源做操作的 function 庫
naming: camel case
,例如 FixedPoint
Integers: 支援三種數字類型,可以使用 as
來轉換成相同類型
使用 let
來宣告變量,有許多聲明模式可以使用,並搭配自動型別端段或自行添加類型註解,以及相關的用法,像是陰影
Scope 與 Express 的使用
使用 const
來宣告常量 (在 Script 和 Module 中共享靜態值的方法)
使用 use
導入其他 Module 或 標準庫使用,導入同時,可以使用 self 代表自己或是擴展來指定
讓我們 Move to Day6