对象
在 Sui 中,对象是链上状态的基本单元。每个对象都有一个唯一的标识符(UID),并且可以包含任意数量的字段。对象可以被创建、转移、销毁,并且可以在链上存储和检索。
对象的定义
对象通过定义具有 key
能力的结构体来创建。key
能力表示该结构体可以作为对象存储在链上。
示例
以下是一个简单的对象定义示例:
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,表示新创建的对象。
示例
以下是一个创建对象的示例:
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
函数接受两个参数:name
和 value
,并返回一个新的 MyObject
实例。
对象的转移
对象可以通过函数参数传递来转移所有权。当一个对象被传递给另一个函数时,该对象的所有权会被转移到该函数。
示例
以下是一个对象转移的示例:
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
函数来销毁。销毁对象会从链上移除该对象,并释放其占用的资源。
示例
以下是一个对象销毁的示例:
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 应用至关重要。