类型反射

在编程语言中,反射 是指程序能够检查和修改其自身结构和行为的能力。 在 Move 中,有一种有限的反射形式,允许你在运行时检查值的类型。 当你需要在同类集合中存储类型信息,或者需要检查某个类型是否属于某个包时,这非常有用。

类型反射在标准库模块 std::type_name 中实现。 简而言之,它提供了一个 get<T>() 函数,该函数返回类型 T 的名称。

实践

该模块相对直观,对结果的操作仅限于获取字符串表示形式以及提取类型的模块和地址。

module book::type_reflection {
    use std::ascii::String;
    use std::type_name::{Self, TypeName};

    /// A function that returns the name of the type `T` and its module and address.
    public fun do_i_know_you<T>(): (String, String, String) {
        let type_name: TypeName = type_name::get<T>();

        // there's a way to borrow
        let str: &String = type_name.borrow_string();

        let module_name: String = type_name.get_module();
        let address_str: String = type_name.get_address();

        // and a way to consume the value
        let str = type_name.into_string();

        (str, module_name, address_str)
    }

    #[test_only]
    public struct MyType {}

    #[test]
    fun test_type_reflection() {
        let (type_name, module_name, _address_str) = do_i_know_you<MyType>();

        //
        assert!(module_name == b"type_reflection".to_ascii_string(), 1);
    }
}

进一步阅读

类型反射是编程语言中的重要组成部分,也是一些更高级模式中的关键部分。