跳到主要内容

Ability 简介

Move 具有独特的类型系统,允许自定义类型能力。在前一节中,我们介绍了 struct 定义及其用法。但是,ArtistRecord 结构体的实例在编译代码时必须被解包。这是没有能力的结构体的默认行为。

在本书中,你会看到名称为 Ability: <名称> 的章节,其中 <名称> 是能力的名称。这些章节将详细介绍该能力,它如何工作以及如何在 Move 中使用。

什么是能力?

能力是一种允许类型具有特定行为的方式。它们是结构体声明的一部分,并定义了结构体实例允许的行为。

能力语法

使用 has 关键字后跟能力列表在结构体定义中设置能力。能力之间用逗号分隔。Move 支持四种能力:copydropkeystore,每种能力用于定义结构体实例的特定行为。

/// 这个结构体具有 `copy` 和 `drop` 能力。
struct VeryAble has copy, drop {
// field: Type1,
// field2: Type2,
// ...
}

概述

能力的快速概述:

除引用外,所有内置类型都具有 copydropstore 能力。引用具有 copydrop 能力。

  • 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) 键值能力 - 允许作为全局存储的键