自定义类型和功能
恭喜您完成了一半的课程。到目前为止你做得很好。在本课中,我们将探讨这些能力——这些能力实际上有助于赋予任何类型执行不同功能的能力。让我们详细探讨一下它们。
能力到底是什么?
在 Move 编程语言中,能力就像特殊规则,决定您可以如何处理某些类型的信息或值。将其视为设置您可以执行的操作的权限,例如共享文档或对其进行编辑。
该系统非常详细,允许您非常具体地了解这些值的行为方式。例如,它可以管理某个值是否可以复制或永久保存在某个地方。
为了实现这一点,Move 使用了一种检查点系统。该语言中的一些基本命令(我们称之为“字节码指令”)需要一个值在使用之前具有正确的“许可单”(或能力)。然而,并不是所有的命令都是严格的。有些不需要这种特殊许可。
因此,简单来说,Move 中的功能有助于严格检查每条数据的功能和去向,确保一切都以正确的方式使用。
能力的语法
要将功能添加到类型,请将功能添加到 struct
并需要使用以下语法。
#![allow(unused)] fn main() { struct StructName has ABILITY [, AnyOtherAbility] { [FIELDS] } }
示例代码如下所示。
#![allow(unused)] fn main() { struct Color has key, store { id: UID, red: u8 } }
不同类型的能力
能力有四种类型。
copy
:允许复制值。drop
:允许丢弃或自动析构。store
:此功能允许值存在于全局存储的结构内部。key
:此功能允许类型充当全局存储的密钥。
我们来一一讨论。
key能力
key
能力允许类型充当全局存储操作的键。这意味着要对全局存储执行某些操作,我们必须向该类型添加 key
功能。如果结构具有 key
能力,则意味着其所有字段都具有 store
能力。以下是我们如何在 Move on Sui 的代码中使用它。
module examples:: copy {
// Importing object module
use sui::object::UID;
use sui::tx_context::{Self, TxContext};
// Declaring ExampleObject
public struct ExampleObject has key {
id: UID,
}
// Initializing the constructor
public entry fun new(ctx: &mut TxContext): ExampleObject {
// Initializing the ExampleObject using let keyword
let object = ExampleObject {
id: object::new(ctx),
}
}
}
Store能力
store
能力是《Move on Sui》中的一个重要能力。在 Move on Sui 中,在 key
旁边添加 store
是一个很好的做法。存储能力允许结构及其字段存在于全局存储中。这是唯一不需要执行操作的功能,但与 key
功能一起使用时,它会自动控制全局存储中类型的存在。以下是我们如何在 Move on Sui 的代码中使用它。
module examples:: copy {
// Importing object module
use sui::object::UID;
use sui::tx_context::{Self, TxContext};
// Declaring ExampleObject
public struct ExampleObject has key, store {
id: UID,
}
// Initializing the constructor
public entry fun new(ctx: &mut TxContext): ExampleObject {
// Initializing the ExampleObject using let keyword
let object = ExampleObject {
id: object::new(ctx),
}
}
}
在《随水而行》中, key
能力是强制使用的,但 store
能力是可选使用的。
Copy能力
复制能力赋予对象被复制的能力。这意味着它使对象能够使用 copy
运算符进行自身复制。让我们看看如何在代码中使用它。
module examples:: copy {
// Importing object module
use sui::object::UID;
use sui::tx_context::{Self, TxContext};
// Declaring ExampleObject
public struct ExampleObject has key, copy {
id: UID,
}
// Initializing the constructor
public entry fun new(ctx: &mut TxContext): ExampleObject {
// Initializing the ExampleObject using let keyword
let object = ExampleObject {
id: object::new(ctx),
}
// Copying the `object` using `copy` operator
let copy_object = copy object;
copy_object;
}
}
Drop能力
drop
能力允许我们删除类型。这意味着当 Move 程序执行时,类型会被破坏。具有删除能力的结构意味着该结构的所有实例都将被删除。但是 Move on Sui,对象有一个 UID,我们不能简单地使用 drop
运算符删除 UID。
小结
了解这些能力至关重要,因为它们在《Move on Sui》中被广泛使用。您一定也注意到在前面的示例中,我们经常使用密钥和存储功能。现在您明白我们为什么使用它们了。接下来,我们将详细了解对象,我们将看到更多能力的用例。