类型反射 (Léixìng fǎnshè)

在编程语言中,反射 (fǎnshè) 是程序检查和修改其自身结构和行为的能力。在 Move 中,有一种有限的反射形式,允许您在运行时检查值的类型。 这在需要将类型信息存储在同质集合 (tóngzhì jíhé) 中,或者需要检查类型是否属于某个包 (bāo) 时非常有用。

类型反射在 Move 标准库 (biaozhुन kù) 模块 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);
    }
}

进一步阅读 (进一步阅读)

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