Skip to content

类型能力

类型能力是一种赋予类型特定行为的机制。它们是结构体声明的一部分,用于定义结构体实例允许的操作范围。

能力语法

能力通过 has 关键字在结构体定义中声明,后接以逗号分隔的能力列表。Move 支持 4 种能力:copydropkeystore。每种能力分别定义了结构体实例的特定行为。

move
/// 此结构体具有 `copy` 和 `drop` 能力。
struct VeryAble has copy, drop {
    // field1: Type1,
    // field2: Type2,
}

能力概述

内置类型和引用的默认能力

  • 所有的内置类型(引用除外)默认具有 copydropstore 能力。
  • 引用默认具有 copydrop 能力。

以下是每种能力的详细描述:

copy: 允许复制结构体实例

  • 含义:能够创建结构体实例的副本,而无需移动或销毁原始实例。
  • 说明:
    • 数字、布尔值等简单类型默认具有 copy 能力。
    • 自定义类型默认不具备 copy 能力,以确保资源模型的不可复制性。
    • 如果需要,可以显式为自定义类型添加 copy 能力:
move
public struct Copyable has copy {}

drop: 允许丢弃结构体实例

  • 含义:可以在不再需要时丢弃结构体实例,无需显式地将其从内存中移除。
  • 说明:
    • 没有 drop 能力的结构体不能被忽略,尝试丢弃会导致编译错误。
    • 示例:
move
public struct IgnoreMe has drop {
    a: u8,
    b: u8,
}

没有 drop 能力的结构体:

move
public struct NoDrop {}

key: 允许结构体在存储中用作键

  • 含义:具有 key 能力的结构体可作为对象的标识符,适用于存储操作。
  • 说明:
    • 在 Sui 中,具有 key 能力的结构体需要包含字段 id: UID,作为唯一标识符。
    • 示例:
move
public struct Object has key {
    id: UID,
    name: String,
}

store: 允许结构体作为字段嵌入其他结构体

  • 含义:结构体可以嵌套在其他具有 key 能力的结构体中。
  • 示例:
    • 具有 store 能力的结构体:
move
public struct Storable has store {}
  • 具有 keystore 能力的结构体,可以包含其他具有 store 能力的字段:
move
public struct Config has key, store {
    id: UID,
    stores: Storable,
}
  • 嵌套存储:
move
public struct MegaConfig has key {
    id: UID,
    config: Config, // 嵌套的 Config
}

无能力的结构体

  • 没有任何能力的结构体无法被复制、丢弃或存储。
  • 这种结构体被称为“烫手山芋”(hot potato),需要特殊的逻辑进行处理。
    • 例如,“烫手山芋”只能通过转移所有权的方式传递。