集合与泛型 - 经济增益

与大多数编程语言一样,集合是 Sui 上 Move 中一个基本且关键的概念。

基础的集合支持 std::vector 来自 Move 标准库,除此之外,Sui 还为不同的数据分组场景提供了各种集合类型。

向量

要使用常用的 std::vector 类型,可以从创建一个空向量开始:

let v = vector::empty<T>();

尖括号内的 T 来自 Move 语言的核心概念 - 泛型类型。 泛型类型使用占位符或符号来表示不同的类型,使代码在不指定确切类型的情况下也能运行。

在向量的情况下,它们可以容纳任何类型的数据:

let v1 = vector::empty<u64>();
let v2 = vector::empty<String>();
let v3 = vector::empty<Castle>();

但是,需要注意的是,一旦创建了一个向量,就不能再向其中添加与定义类型不同的元素。例如,尝试向 v1 添加字符串或向 v2 添加整数会导致错误。

回到 Move Castle 游戏中,根据游戏机制,士兵将对城堡的经济产生积极影响,城堡在战斗后将获得经济补偿或惩罚,我们可以使用“增益”来实现这些机制。

定义经济增益结构体,并将其添加到 core.move 中城堡数据的经济字段中:

public struct Economy has store {
    treasury: u64,
    base_power: u64,
    settle_time: u64,
    soldier_buff: EconomicBuff,
    battle_buff: vector<EconomicBuff>,
}

需要注意的是,向量的最大大小为1000。

sui::table::Tablesui-framework 提供的一种类似映射的集合类型。与向量类似,表的键和值字段可以是指定类型或泛型类型,但表集合中的所有值和所有键必须是相同的类型。

// 新建空表
let table1 = table::new(&ctx);
// 添加键和值
table::add(&mut table1, 0, false);
// 检索值
let value = table::borrow(&table1, 0);
assert!(value == &false, 0);

表的 new 函数的输入参数 &ctx 是入口函数的事务上下文,表使用它来生成表的 UID。我们将在后面的课程中介绍事务上下文和入口函数。

其他集合类型 Sui 框架提供的各种集合类型介绍可以在官方文档中找到:https://docs.sui.io/concepts/sui-move-concepts/collections