介绍
Vector<T>是 Move 中表示集合的类型,是一个T类型的结合,push添加一个元素,pop弹出一个元素。T可以是任何类型,例如:Vector<u64>、Vector<address>、Vector<0x1::MyModule::MyResource>、Vector<Vector<u8>>。
字面量
1.初始化
任何非引用类型的数值都可以作为Vector的元素来创建。
| 语法 | 操作 | 描述 |
|---|---|---|
verctor<T> |
T是任何一种非引用类型 |
定义一个空集合 |
vector[e1, e2,..., en] |
定义一个有初始元素的集合 | 定义一个有初始元素的集合 |
在以上例子中,Move 编译器如果无法识别Vector中的元素类型,可以显示定义一个:
vector<T>[]: vector<T>vector<T>[e1, e2,..., en]: vector<T>vector[]: vector<bool>vector[1u8, 2u8, 3u8]: vector<u8>vector<address>[@0x1, @0x2]: vector<address>
2.Vector 字面量
vector<u8>通常用来表示字节数组,这些值通常用来存储加密后的值(例如:公钥和哈希值)。目前vector<u8>支持存放两种字面量的类型,二进制(字节)字符串和十六进制的字符串。
二进制(字节)字符串
二进制(字节)字符串是以b为前缀的字符串字面量,例如:b"Hello!\n"。
目前 Move 中支持的 ASCII 编码即定义如下所示:
| 转义符号 | 描述 |
|---|---|
\\n |
换行 |
\\r |
回车 |
\\t |
Tab |
\\\\ |
反斜杠 |
\\0 |
Null |
\\" |
引用 |
\\xHH |
十六进制HH |
十六进制字符串
十六进制字符串是以x为前缀的字符串字面量,例如:x"48656C6C6F210A"。
举例:
script {fun byte_and_hex_string() {assert!(b"" == x"", 0)assert!(b"Hello!\n" == x"48656C6C6F210A", 1);assert!(b"\x48\x65\x6C\x6C\x6F\x21\x0A" == x"48656C6C6F210A", 2);assert!(b"\"Hello\tworld!\"\n \r \\Null=\0" ==x"2248656C6C6F09776F726C6421220A200D205C4E756C6C3D00",3);}}
用法
vector在 Move 源文件 Std Module 中 (Std::Vector) 已定义以下几个方法。
| 函数 | Desc | Abort? |
|---|---|---|
vector::empty<T>(): vector<T> |
定义一个元素类型为T的空结合 |
Never |
Vector::singleton<T>(t: T): vector<T> |
定义一个元素大小为1的T集合 |
Never |
Vector::push_back<T>(v: &mut T, t: T) |
在v后面添加一个t元素 |
Never |
Vector::pop_back<T>(v: &mut T): T |
移除并返回最后一个元素 | If v is empty |
Vector::borrow<T>(v: &vector<T>, i: u64): &T |
返回v集合索引为i的不可变引用 |
If i is not in bounds |
Vector::borrow_mut<T>(v: &mut vector<T>, i: u64): &mut T |
返回v集合索引为i的可变引用 |
If i is not in bounds |
Vector::destory_empty<T>(v: vector<T>) |
删除集合v |
If v is not empty |
Vector::append<T>(v1: &mut vector<T>, v2: vector<T>) |
将v2集合添加到v1集合的尾部 |
If i is not in bounds |
举例
use Std::Vector;let v = Vector::empty<u64>();Vector::push_back(&mut v, 5);Vector::push_back(&mut v, 6);assert!(*Vector::borrow(&v, 0) == 5, 42);assert!(*Vector::borrow(&v, 1) == 6, 42);assert!(Vector::pop_back(&mut v) == 6, 42);assert!(Vector::pop_back(&mut v) == 5, 42);
销毁
其实vector<T>的能力依赖于元素类型T的能力。例如,vectors 中的元素类型没有drop属性,必须被显示销毁:Vector::destroy_empty。
// 元素无drop属性fun destroy_any_vector<T>(vec: vector<T>) {Vector::destroy_empty(vec) // deleting this line will cause a compiler error}// 元素有drop属性fun destroy_droppable_vector<T: drop>(vec: vector<T>) {// valid!// nothing needs to be done explicitly to destroy the vector}
vectors 中的元素如果没有copy的属性是不能被复制的。
let x = Vector::singleton<u64>(10);let y = copy x; // compiler error without the copy!
经常执行copy的话,消耗很多资源。所以 Move 编译器要求copy要显示表示出来。
