向量

向量是在 Move 中存储元素集合的一种本地方式。它们类似于其他编程语言中的数组,但有一些不同之处。在本节中,我们介绍 vector 类型及其操作。

向量语法

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]
];

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);

销毁非可丢弃类型的向量

非可丢弃类型的向量不能被丢弃。如果你定义了一个没有 drop 能力的类型的向量,则该向量的值不能被忽略。然而,如果向量是空的,编译器要求显式调用 destroy_empty 函数。

    /// 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();
    }

进一步阅读

  • 在 Move 参考文档中查看 向量