use
在 import 篇章我們已經介紹過,這邊我們更詳細介紹和複習各種用法。
這邊用到標準庫的 push_back 函數,使用後將從向量的末尾v
就地彈出一個元素並返回擁有的值。v
如果為空將中止。標準庫之後會詳細介紹。
native public fun push_back<Element>(v: &mut vector<Element>, e: Element);
use <address>::<module name>;
use <address>::<module name> as <module alias name>;
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 所有 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