自定义类型和能力 - 创建 Castle 结构体
在 Move 中,用户可以使用 struct 关键字创建自定义类型。由 struct 定义的结构体通过允许在其中分组各种数据字段,作为组织数据的基础元素。
在面向对象编程语言中,对象由其属性定义。同样在 Sui 的 Move 中,您可以使用 struct 定义自定义对象。
1. 自定义类型 - struct
现在让我们创建 castle 结构体。在 castle.move 文件中:
module move_castle::castle {
    use std::string::{Self, String};
    /// The castle struct
    public struct Castle {
        name: String,
        description: String,
        serial_number: u64,
    }
}
castle 结构体包含三个属性:
- name:城堡的名称
- description:城堡的描述
- serial_number:城堡的序列号,影响城堡的视觉呈现和核心游戏数据
我们将在后面的课程中使用 castle 结构体创建 Sui 对象,现在我们只介绍结构体本身。
2. 带有能力的类型
在 Sui 的 Move 中,与类型相关的另一个基本概念是能力。每种类型(结构体)最多有四种能力,这些能力定义了该类型对象在 Sui 运行时中的行为。
四种能力是:
- copy- 对象可以被复制或克隆。
- drop- 对象可以被销毁。
- key- 对象可以通过其对象 ID 进行索引。
- store- 对象可以存储在全局存储中。
在 Sui 的 Move 中,具有 key 和 store 能力的自定义类型被认为是资产。例如,NFT 是一种资产,存储在 Sui 的链上存储中,
并且可以在账户之间转移。在我们的例子中,城堡是资产。
因此,我们需要将 castle 结构体修改为:
module move_castle::castle {
    use std::string::{Self, String};
    /// The castle struct
    public struct Castle has key, store {
        id: UID,
        name: String,
        description: String,
        serial_number: u64,
    }
}
您是否注意到一个特殊字段 id: UID 被添加到 Castle 结构体中?这是必须的:具有 key 能力的结构体的第一个字段必须是 id: UID,以便在链上存储对象的唯一地址。