向量

向量 #

vector<T> 是 Move 提供的唯一原始集合类型。vector<T>T 的同质集合,可以通过从“末端”推入/弹出值来增大或缩小。

vector<T> 可以用任何类型 T 实例化。例如,vector<u64>vector<address>vector<0x42::MyModule::MyResource>vector<vector<u8>> 都是有效的向量类型。

一般向量字面量

任何类型的向量都可以用 vector 向量字面量创建。

SyntaxTypeDescription
vector[]vector[]: vector<T> where T is any single, non-reference typeAn empty vector
vector[e1, …, en]vector[e1, ..., en]: vector<T> where e_i: T s.t. 0 < i <= n and n > 0A vector with n elements (of length n)

在这些情况下,向量的类型是从元素类型或向量的用法中推断出来的。如果无法推断类型,或者只是为了更加清楚,可以显式指定类型:

vector<T>[]: vector<T>
vector<T>[e1, ..., en]: vector<T>

向量字面量例子

(vector[]: vector<bool>);
(vector[0u8, 1u8, 2u8]: vector<u8>);
(vector<u128>[]: vector<u128>);
(vector<address>[@0x42, @0x100]: vector<address>);

Vector<u8> 字面量

vector<u8> 字面量用于表示 move 中的字节十六进制字符串

let byte_string_example:vector<u8> = b"Hello world"; //Byte strings are quoted string literals prefixed by a b
let hex_string_example:vector<u8> = x"48656c6c6f20776f726c64"; //Hex strings are quoted string literals prefixed by a x

可以在这找到有关向量各种操作的最新文档。

let list = vector::empty<u64>();
        
vector::push_back(&mut list, 10);
vector::push_back(&mut list, 20);

assert!(*vector::borrow(&list, 0) == 10, 9);
assert!(*vector::borrow(&list, 1) == 20, 9);

assert!(vector::pop_back(&mut list) == 20, 9);
assert!(vector::pop_back(&mut list) == 10, 9);

销毁和复制向量

vector<T> 的某些行为取决于元素类型 T 的能力。例如,包含没有 drop 的元素的向量不能像上面示例中的 v 那样被隐式丢弃——它们必须用 vector::destroy_empty 显式销毁。

请注意 vector::destroy_empty 将在运行时中止,除非 vec 包含零元素:

fun destroy_any_vector<T>(vec: vector<T>) {
    vector::destroy_empty(vec) // deleting this line will cause a compiler error
}

但是使用 drop 删除包含元素的向量不会发生错误:

But no error would occur for dropping a vector that contains elements with drop:

fun destroy_droppable_vector<T: drop>(vec: vector<T>) {
    // valid!
    // nothing needs to be done explicitly to destroy the vector
}

同样,向量不能被复制,除非元素类型有 copy(能力)。换句话说,当且仅当 T 具有 copy 时,vector<T> 才具有 copy。然而,即使是可复制的向量也永远不会被隐式复制:

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

大型向量的副本可能很昂贵,因此编译器需要显式 copy,以便更容易看到它们发生的位置。