介绍

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中的元素类型,可以显示定义一个:

  1. vector<T>[]: vector<T>
  2. vector<T>[e1, e2,..., en]: vector<T>
  3. vector[]: vector<bool>
  4. vector[1u8, 2u8, 3u8]: vector<u8>
  5. 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"
举例:

  1. script {
  2. fun byte_and_hex_string() {
  3. assert!(b"" == x"", 0)
  4. assert!(b"Hello!\n" == x"48656C6C6F210A", 1);
  5. assert!(b"\x48\x65\x6C\x6C\x6F\x21\x0A" == x"48656C6C6F210A", 2);
  6. assert!(
  7. b"\"Hello\tworld!\"\n \r \\Null=\0" ==
  8. x"2248656C6C6F09776F726C6421220A200D205C4E756C6C3D00",
  9. 3
  10. );
  11. }
  12. }

用法

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

举例

  1. use Std::Vector;
  2. let v = Vector::empty<u64>();
  3. Vector::push_back(&mut v, 5);
  4. Vector::push_back(&mut v, 6);
  5. assert!(*Vector::borrow(&v, 0) == 5, 42);
  6. assert!(*Vector::borrow(&v, 1) == 6, 42);
  7. assert!(Vector::pop_back(&mut v) == 6, 42);
  8. assert!(Vector::pop_back(&mut v) == 5, 42);

销毁

其实vector<T>的能力依赖于元素类型T的能力。例如,vectors 中的元素类型没有drop属性,必须被显示销毁:Vector::destroy_empty

  1. // 元素无drop属性
  2. fun destroy_any_vector<T>(vec: vector<T>) {
  3. Vector::destroy_empty(vec) // deleting this line will cause a compiler error
  4. }
  5. // 元素有drop属性
  6. fun destroy_droppable_vector<T: drop>(vec: vector<T>) {
  7. // valid!
  8. // nothing needs to be done explicitly to destroy the vector
  9. }

vectors 中的元素如果没有copy的属性是不能被复制的。

  1. let x = Vector::singleton<u64>(10);
  2. let y = copy x; // compiler error without the copy!

经常执行copy的话,消耗很多资源。所以 Move 编译器要求copy要显示表示出来。