结构体能力 - key
, copy
, drop
, store
在之前的课程中,我们学习了结构体,并了解到一个结构体需要具备 key 能力才能成为对象:
public struct AdminCap has key {
id: UID,
num_frens: u64,
}
除了 key
能力,结构体还可以具有其他 3 种能力:store
、copy
和 drop
。
结构体可以具有多种能力。然而,若要使一个结构体具有特定能力,它的所有字段必须具有相同的能力。
store
能力允许一个结构体成为其他结构体的一部分。请注意,
如果下面的 NestedStruct
有另一个 DoubleNestedStruct
字段,该结构体也需要具有 store
能力。
public struct NestedStruct has store {
value: u64,
}
public struct Container has key {
id: UID,
nested: NestedStruct,
}
copy
能力允许结构体被“复制”,这会创建一个具有相同字段值的结构体实例。
请注意,对象结构体(具有键能力和 ID 字段的那些)不能具有复制能力,因为 UID 结构体没有复制能力。
public struct CopyableStruct has copy {
value: u64,
}
fun copy(original: CopyableStruct) {
let copy = original;
original.value = 1;
copy.value = 2;
// 现在有两个拥有不同值的 CopyableStructs
}
drop
能力允许结构体在函数结束时被隐式销毁(析构),而不需要显式“销毁”:
public struct DroppableStruct has drop {
value: u64,
}
fun copy() {
let droppable = DroppableStruct { value: 1 };
// 在此函数结束时,droppable 将被销毁。
// 我们不需要显式地销毁它:
// let DroppableStruct { value: _ } = droppable;
}
务必要记住,只有在所有字段都具有相同能力的情况下,结构体才能拥有某种能力。 如果不记住这一点,开发人员在尝试创建一个可销毁的结构体时,但却有一个不可销毁的字段,会感到非常困惑。