Skip to content

对象

在 Sui 中,对象是链上状态的基本单元。每个对象都有一个唯一的标识符(UID),并且可以包含任意数量的字段。对象可以被创建、转移、销毁,并且可以在链上存储和检索。

对象的定义

对象通过定义具有 key 能力的结构体来创建。key 能力表示该结构体可以作为对象存储在链上。

示例

以下是一个简单的对象定义示例:

move
module book::objects;

use std::string::String;

/// 定义一个具有 `key` 能力的对象
public struct MyObject has key {
    id: UID,
    name: String,
    value: u64,
}

在这个示例中,MyObject 结构体具有 key 能力,因此可以作为对象存储在链上。它包含三个字段:id(唯一标识符)、name(字符串类型)和 value(无符号 64 位整数)。

对象的创建

对象可以通过调用 object::new 函数来创建。该函数返回一个新的 UID,表示新创建的对象。

示例

以下是一个创建对象的示例:

move
module book::objects;

use std::string::String;
use sui::object;

public fun create_object(name: String, value: u64): MyObject {
    let id = object::new();
    MyObject { id, name, value }
}

在这个示例中,create_object 函数接受两个参数:namevalue,并返回一个新的 MyObject 实例。

对象的转移

对象可以通过函数参数传递来转移所有权。当一个对象被传递给另一个函数时,该对象的所有权会被转移到该函数。

示例

以下是一个对象转移的示例:

move
module book::objects;

use std::string::String;
use sui::object;

public fun create_object(name: String, value: u64): MyObject {
    let id = object::new();
    MyObject { id, name, value }
}

public fun transfer_object(obj: MyObject): MyObject {
    obj
}

#[test]
fun test_transfer() {
    let obj = create_object(b"Test".to_string(), 42);
    let new_obj = transfer_object(obj);
    // obj 在此处不可用
}

在这个示例中,transfer_object 函数接受一个 MyObject 实例作为参数,并返回该实例。调用 transfer_object 函数会将 obj 的所有权转移给 new_obj

对象的销毁

对象可以通过调用 object::delete 函数来销毁。销毁对象会从链上移除该对象,并释放其占用的资源。

示例

以下是一个对象销毁的示例:

move
module book::objects;

use std::string::String;
use sui::object;

public fun create_object(name: String, value: u64): MyObject {
    let id = object::new();
    MyObject { id, name, value }
}

public fun destroy_object(obj: MyObject) {
    object::delete(obj.id);
}

#[test]
fun test_destroy() {
    let obj = create_object(b"Test".to_string(), 42);
    destroy_object(obj);
    // obj 在此处不可用
}

在这个示例中,destroy_object 函数接受一个 MyObject 实例作为参数,并调用 object::delete 函数销毁该对象。

总结

对象是 Sui 中链上状态的基本单元。通过定义具有 key 能力的结构体,可以创建、转移和销毁对象。理解对象的生命周期和所有权模型对于编写安全和高效的 Sui 应用至关重要。