对象数据结构 - ObjectTable
另一种可以用来存储对象的很酷的数据结构是 ObjectTable。它与 ObjectBag 不同,只允许存储单一类型的对象。 尽管 ObjectTable 更有限,但当用户希望为表中同一类型的不同对象指定特定的键名时,它仍然非常有用。
use sui::object_table::{Self, ObjectTable};
public struct MyObject has key, store {
id: UID,
}
public struct MyTable has key {
id: UID,
table: ObjectTable<String, MyObject>,
}
public fun create_table(ctx: &mut TxContext) {
transfer::transfer(MyTable {
id: object::new(ctx),
table: object_table::new(ctx),
}, tx_context::sender(ctx));
}
public fun add_to_table(my_bag: &mut MyBag, key: String, object: MyObject) {
object_table::add(&mut my_bag.object_bag, key, object);
}
在底层,ObjectTable 也使用动态对象字段,类似于 ObjectBag。在定义对象表字段时,我们还需要指定键和值的确切类型。
ObjectTable 还提供与 ObjectHat 相同的函数:add
、contains
、remove
、borrow
、borrow_mut
、length
和 is_empty
。