类型名称 - Type Name

Move 中的类型定义为结构体,包含三个组件:

  • 模块地址:定义该类型的模块的地址
  • 模块名称:定义该类型的模块的名称
  • 类型名称:结构体的名称

Move 中的类型也作为类型参数在函数之间传递。在某些情况下,开发者可能希望检查类型以应用不同的逻辑。这时,type_name 模块就派上用场了。 它提供了一种将 Move 类型转换为值的方法。这对于调试、日志记录和其他需要在运行时检查值的类型的使用场景非常有用。

// 例子用途:
public fun process<T>(val: T) {
    let type_name = type_name::get<T>();
    let type_name_str = type_name::into_string(type_name);
    if (type_name_str == utf8(b"0xdeadbeef::my_module::MyStruct")) {
        // 操作
    } else if (type_name_str == "0xdeadbeef::my_module::MyOtherStruct") {
        // 操作
    } else {
        abort 0;
    }
}

不同的组件也可以从一个类型中提取出来:

let type_name = type_name::get<T>();
let module_name = type_name::get_module(&type_name);
let address = type_name::get_address(&type_name);

类型名称应谨慎使用,因为比较类型名称不是确定值类型的可靠方法。建议尽可能使用 Move 的类型系统来确定值的类型。