Move语言 导入
Move 在默认上下文中只能使用基本类型,也就是整型、布尔型和地址,可以执行的有意义或有用的操作也就是操作这些基本类型,或者基于基本类型定义新的类型。
除此之外还可以导入已发布的模块(或标准库)。
直接导入
可以直接在代码中按其地址使用模块:
script { fun main(a: u8) { 0x1::Debug::print(&a); } }
在此示例中,我们从地址0x1(标准库)导入了 Debug 模块,并使用了它的 print 方法。
关键字 use
要使代码更简洁(注意,0x1 是特殊的地址,实际地址是很长的),可以使用关键字use:
use <Address>::<ModuleName>;
这里 <Address>
是模块发布者的地址,<ModuleName>
是模块的名字。非常简单,例如,我们可以像下面这样从 0x1
地址导入 Vector
模块。
use 0x1::Vector;
访问模块的内容
要访问导入的模块的方法(或类型),需要使用::符号。非常简单,模块中定义的所有公开成员都可以通过双冒号进行访问。
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 (mind braces) 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); } }
使用 Self 导入模块和模块成员
导入语句还可以进一步扩展,通过使用 Self
来同时导入模块和模块成员,这里 Self
代表模块自己。
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); } }
使用 use as
当两个或多个模块具有相同的名称时,可以使用关键字as更改导入的模块的名称,这样可以在解决命名冲突的同时缩短代码长度。
语法:
use <Address>::<ModuleName> as <Alias>;
在脚本中:
script { use 0x1::Vector as V; // V now means Vector fun main() { V::empty<u64>(); } }
在模块中:
module Math { use 0x1::Vector as Vec; fun length(&v: vector<u8>): u64 { Vec::length(&v) } }
脚本中的例子:
script { use 0x1::Vector::{ Self as V, empty as empty_vec }; fun main() { // `empty` imported as `empty_vec` let vec = empty_vec<u8>(); // Self as V = Vector V::push_back(&mut vec, 10); } }
Move语言中代码的执行是通过调用函数实现的。Move语言函数以 fun 关键字开头,后跟函数名称、扩在括号中的参数,以及扩在花括号中的函数体。fun function_name(arg1: u64, arg2: boo ...