Sui Move标准库类型名称(type_name)模块提供了获取类型字符串名称、解析其组成信息及运行时反射等功能,有助于通过对类型的判断,构造更加健壮安全的合约代码。
std::type_name
提供了获取类型字符串名称、解析其组成信息及运行时反射等功能,有助于通过对类型的判断,构造更加健壮安全的合约代码。
TypeName
与字符串之间的转换分类 | 函数名 | 参数 | 功能描述 |
---|---|---|---|
动态类型获取 | get<T> |
无参数 | 返回类型T的TypeName ,使用首次定义的PackageID |
get_with_original_ids<T> |
无参数 | 返回类型T的TypeName ,使用原始的PackageID,不受升级影响 |
|
类型检查 | is_primitive |
self: &TypeName |
判断TypeName 是否为简单类型 |
信息提取 | get_address |
self: &TypeName |
获取类型名的地址字符串(Base16 编码) |
get_module |
self: &TypeName |
获取类型名的模块名称 | |
内部字符串访问 | borrow_string |
self: &TypeName |
获取TypeName 内部字符串的引用 |
into_string |
self: TypeName |
获取TypeName 内部字符串的值 |
module cookbook::bookself {
use sui::event;
use std::ascii::String;
use std::type_name::{Self, TypeName};
public struct BookShelf has key {
id: UID,
}
fun init(ctx: &mut TxContext) {
transfer::share_object(
Bookshelf{
id: object::new(ctx),
}
);
}
public struct EventPrimitiveTypes has copy, drop {
bool_type_name: String,
u8_type_name: String,
u256_type_name: String,
address_type_name: String,
vector_type_name: String,
u8_is_primitive: bool,
book_shelf_is_primitive: bool,
}
public struct EventInfo has copy, drop {
type_name_address: String,
type_name_module: String,
}
public entry fun emit_primitive_types() {
event::emit(EventPrimitiveTypes{
bool_type_name: type_name::get<bool>().into_string(),
u8_type_name: type_name::get<u8>().into_string(),
u256_type_name: type_name::get<u256>().into_string(),
address_type_name: type_name::get<address>().into_string(),
vector_type_name: type_name::get<vector<u8>>().into_string(),
u8_is_primitive: type_name::get<u8>().is_primitive(),
book_shelf_is_primitive: type_name::get<Bookshelf>().is_primitive(),
})
}
public entry fun emit_get_info() {
event::emit(EventInfo{
type_name_address: type_name::get<Bookshelf>().get_address(),
type_name_module: type_name::get<Bookshelf>().get_module(),
})
}
}
export PACKAGE_ID=0xa2bf2b8207708d9d4e7c57e3d035537ca80e490240340369ed0837f40f231fe2
export UPGRADE_CAP=0x8655cc8ea0c7b79abac0f15157c81c25b0a72b66efcdec32d8c8aa914faea1aa
$ sui client call --package $PACKAGE_ID --module bookself --function emit_primitive_types
$ sui client call --package $PACKAGE_ID --module bookself --function emit_get_info
为了展示
get<T>
和get_with_original_ids<T>
的区别,先对合约进行升级。以下升级合约代码忽略了部分升级前的代码。
module cookbook::bookself {
use sui::event;
use std::ascii::String;
use std::type_name::{Self, TypeName};
public struct BookShelf has key {
id: UID,
}
// 书本结构定义
public struct Book has key {
id: UID,
// 书本标题
title: String,
}
......
public struct EventTypeName has copy, drop {
defining_id_type: String,
original_id_type: String,
}
public entry fun compare_get_methods<T>() {
let defining_id_type = type_name::get<T>();
let original_id_type = type_name::get_with_original_ids<T>();
event::emit(EventTypeName{
defining_id_type: defining_id_type.into_string(),
original_id_type: original_id_type.into_string(),
});
}
}
sui client upgrade --upgrade-capability $UPGRADE_CAP
export PACKAGE_V2_ID=0x2e1a39d4c09dfbb9ac5820716df1ef6f4b3c2de3d33b769b819e41a4a7d2311d
$ sui client call --package $PACKAGE_V2_ID --module bookself --function compare_get_methods --type-args ${PACKAGE_V2_ID}::bookself::Book
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!