类型能力
类型能力是一种赋予类型特定行为的机制。它们是结构体声明的一部分,用于定义结构体实例允许的操作范围。
能力语法
能力通过 has
关键字在结构体定义中声明,后接以逗号分隔的能力列表。Move 支持 4 种能力:copy
、drop
、key
和 store
。每种能力分别定义了结构体实例的特定行为。
move
/// 此结构体具有 `copy` 和 `drop` 能力。
struct VeryAble has copy, drop {
// field1: Type1,
// field2: Type2,
}
能力概述
内置类型和引用的默认能力
- 所有的内置类型(引用除外)默认具有
copy
、drop
和store
能力。 - 引用默认具有
copy
和drop
能力。
以下是每种能力的详细描述:
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
,作为唯一标识符。 - 示例:
- 在 Sui 中,具有
move
public struct Object has key {
id: UID,
name: String,
}
store: 允许结构体作为字段嵌入其他结构体
- 含义:结构体可以嵌套在其他具有
key
能力的结构体中。 - 示例:
- 具有
store
能力的结构体:
- 具有
move
public struct Storable has store {}
- 具有
key
和store
能力的结构体,可以包含其他具有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),需要特殊的逻辑进行处理。
- 例如,“烫手山芋”只能通过转移所有权的方式传递。