不可变对象
到目前为止,我们已经创建了两个对象:SuiFren 和 GiftBox。这两个都是归属对象。 它们由用户拥有,只有所有者才能将其包含在交易中。我们还简要讨论了共享对象——那些可以包含在任何交易中的对象。 在本课中,我们将讨论第三种对象类型——不可变对象。
不可变对象与共享对象几乎相同。任何用户都可以将它们作为其交易的一部分。 然而,共享对象可以作为可变引用包含,因此可以被任何人修改。而不可变对象在“冻结”后永远不能改变。
public struct ColorObject has key {
id: UID,
red: u8,
green: u8,
blue: u8,
}
public entry fun freeze_owned_object(object: ColorObject) {
transfer::freeze_object(object)
}
public entry fun create_immutable(red: u8, green: u8, blue: u8, ctx: &mut TxContext) {
let color_object = ColorObject {
id: object::new(ctx),
red,
green,
blue,
};
transfer::freeze_object(color_object);
}
在上面的示例中,create_immutable
创建一个对象并立即将其冻结,使其成为不可变对象。而 freeze_owned_object
则是接收一个现有的归属对象并将其变为不可变对象。请注意,如果在共享对象上调用 transfer::freeze_object
会导致错误。freeze_owned_object
展示了不可变对象与共享对象之间的另一个关键区别——归属对象不能变为共享对象(需要在创建对象后的同一交易中立即调用 transfer::share_object
),但归属对象可以在任何时候根据所有者的意愿变为不可变对象。
不可变对象可以通过不可变引用(&)在任何时候包含:
public fun read_immutable(color: &ColorObject): (u8, u8, u8) {
(color.red, color.green, color.blue)
}
read_immutable
可以在任何不可变(冻结的)颜色对象上调用,并且不需要所有权。