类型名称 - 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 的类型系统来确定值的类型。