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

如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!