自定义类型和能力 - 创建 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 中,具有 keystore 能力的自定义类型被认为是资产。例如,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,以便在链上存储对象的唯一地址。