能力:复制
在 Move 中,类型上的 copy 能力表示该类型的实例或值可以被复制。尽管在处理数字或其他简单类型时,这种行为可能非常自然,但在 Move 中自定义类型默认不具备这种能力。这是因为 Move 旨在表达数字资产和资源,而无法复制是资源模型的一个关键要素。
然而,Move 类型系统允许您定义具有 copy 能力的自定义类型。
public struct Copyable has copy {}
在上面的例子中,我们定义了一个具有 copy 能力的自定义类型 Copyable
。这意味着 Copyable
的实例可以被复制,无论是隐式的还是显式的。
let a = Copyable {};
let b = a; // `a` is copied to `b`
let c = *&b; // explicit copy via dereference operator
let Copyable {} = a; // doesn't have `drop`
let Copyable {} = b; // doesn't have `drop`
let Copyable {} = c; // doesn't have `drop`
在上面的例子中,a
被隐式地复制到 b
,然后使用解引用操作符显式地复制到 c
。如果 Copyable
没有 copy 能力,代码将无法编译,Move 编译器会抛出错误。
复制与丢弃
copy
能力与 drop
能力 密切相关。如果一个类型具有 copy 能力,那么它很可能也应该具有 drop
能力。这是因为 drop 能力用于在实例不再需要时清理资源。如果一个类型只有 copy,那么管理它的实例会变得更加复杂,因为这些值不能被忽略。
public struct Value has copy, drop {}
Move 中的所有原始类型都表现得像是具有 copy 和 drop 能力。这意味着它们可以被复制和丢弃,并且 Move 编译器会为它们处理内存管理。
具有 copy
能力的类型
Move 中的所有本机类型都具有 copy
能力。这包括:
标准库中定义的所有类型也具有 copy
能力。这包括:
进一步阅读
- 类型能力 在 Move 参考中。