结构体能力 - key, copy, drop, store

在之前的课程中,我们学习了结构体,并了解到一个结构体需要具备 key 能力才能成为对象:

public struct AdminCap has key {
    id: UID,
    num_frens: u64,
}

除了 key 能力,结构体还可以具有其他 3 种能力:storecopydrop。 结构体可以具有多种能力。然而,若要使一个结构体具有特定能力,它的所有字段必须具有相同的能力。

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;
}

务必要记住,只有在所有字段都具有相同能力的情况下,结构体才能拥有某种能力。 如果不记住这一点,开发人员在尝试创建一个可销毁的结构体时,但却有一个不可销毁的字段,会感到非常困惑。