跳到主要内容

向量

向量是 Move 中存储元素集合的原生方式。它们与其他编程语言中的数组类似,但也有一些差异。在本节中,我们介绍向量(vector)类型及其操作。

向量的语法

向量类型使用 vector 关键字定义,向量的类型通过后跟的尖括号(<>)中的元素类型来确定。元素的类型可以是任何有效的 Move 类型,包括其他向量。Move 提供向量字面量语法,允许你使用 vector 关键字创建向量,后跟包含元素的方括号([]),也可以是一个空向量,即不包含任何元素。

// An empty vector of bool elements.
let empty: vector<bool> = vector[];

// A vector of u8 elements.
let v: vector<u8> = vector[10, 20, 30];

// A vector of vector<u8> elements.
let vv: vector<vector<u8>> = vector[
vector[10, 20],
vector[30, 40]
];

向量类型是 Move 中的内置类型,不需要从模块导入。但是,向量运算是在 std::vector 模块中定义的,您需要导入该模块才能使用它们。

向量的操作

标准库提供了操作向量的方法。以下是一些最常用的操作:

  • push_back:将一个元素添加到向量的末尾。
  • pop_back:从向量中删除最后一个元素。
  • length:返回向量中元素的数量。
  • is_empty:如果向量为空,则返回 true。
  • remove:删除给定索引处的元素。

The standard library provides methods to manipulate vectors. The following are some of the most commonly used operations:

  • push_back: Adds an element to the end of the vector.
  • pop_back: Removes the last element from the vector.
  • length: Returns the number of elements in the vector.
  • is_empty: Returns true if the vector is empty.
  • remove: Removes an element at a given index.

vector 类型是 Move 中的内置类型,不需要从模块中导入。然而,向量操作定义在 std::vector 模块中,你需要导入该模块才能使用这些操作。

向量操作 标准库提供了许多操作向量的方法。以下是一些常用的操作:

push_back: 在向量末尾添加一个元素。 pop_back: 移除向量的最后一个元素。 length: 返回向量中元素的数量。 is_empty: 如果向量为空则返回 true。 remove: 移除给定索引处的元素。

let mut v = vector[10u8, 20, 30];

assert!(v.length() == 3, 0);
assert!(!v.is_empty(), 1);

v.push_back(40);
let last_value = v.pop_back();

assert!(last_value == 40, 2);

Destroying a Vector of non-droppable types

不可丢弃类型的向量不能被丢弃。如果定义不具有丢弃能力的类型向量,则不能忽略向量值。但是,如果向量为空,编译器需要显式调用 destroy_empty 函数。

A vector of non-droppable types cannot be discarded. If you define a vector of types without drop ability, the vector value cannot be ignored. However, if the vector is empty, compiler requires an explicit call to destroy_empty function.

    /// A struct without `drop` ability.
public struct NoDrop {}

#[test]
fun test_destroy_empty() {
// Initialize a vector of `NoDrop` elements.
let v = vector<NoDrop>[];

// While we know that `v` is empty, we still need to call
// the explicit `destroy_empty` function to discard the vector.
v.destroy_empty();
}