Ability 简介
Move 具有独特的类型系统,允许自定义类型能力。在前一节中,我们介绍了 struct 定义及其用法。但是,Artist 和 Record 结构体的实例在编译代码时必须被解包。这是没有能力的结构体的默认行为。
在本书中,你会看到名称为
Ability: <名称>的章节,其中<名称>是能力的名称。这些章节将详细介绍该能力,它如何工作以及如何在 Move 中使用。
什么是能力?
能力是一种允许类型具有特定行为的方式。它们是结构体声明的一部分,并定义了结构体实例允许的行为。
能力语法
使用 has 关键字后跟能力列表在结构体定义中设置能力。能力之间用逗号分隔。Move 支持四种能力:copy、drop、key 和 store,每种能力用于定义结构体实例的特定行为。
/// 这个结构体具有 `copy` 和 `drop` 能力。
struct VeryAble has copy, drop {
// field: Type1,
// field2: Type2,
// ...
}
概述
能力的快速概述:
除引用外,所有内置类型都具有 copy、drop 和 store 能力。引用具有 copy 和 drop 能力。
copy- 允许结构体被复制。详见 Ability: Copy 章节。drop- 允许结构体被丢弃或舍弃。详见 Ability: Drop 章节。key- 允许结构体用作存储中的键。详见 Ability: Key 章节。store- 允许结构体存储在具有 key 能力的结构体中。详见 Ability: Store 章节。
虽然在这里提到它们很重要,但我们将在后续章节中详细介绍每种能力,并给出如何使用它们的适当上下文。
没有能力
没有能力的结构体不能被丢弃、复制或存储在存储中。我们称这种结构体为 Hot Potato。这是一个玩笑,但也是记住没有能力的结构体就像一个烫手山芋的好方法——它只能被传递,需要特殊处理。Hot Potato 是 Move 中最强大的模式之一,我们在 Hot Potato 章节中详细介绍了它。
Move 资源能力标志说明
在 Move 语言中,能力值 (abilities) 是通过位标志 (bit flags) 来表示的。当我们看到能力值字段是 8 时,这对应着特定的能力标志位。让我们详细解析:
能力位标志对照表
能力值 8 的含义:
1 = copy (0b0001) 复制能力 - 允许值被复制
2 = drop (0b0010) 丢弃能力 - 允许值被丢弃
4 = store (0b0100) 存储能力 - 允许值被存储在全局状态
8 = key (0b1000) 键值能力 - 允许作为全局存储的键