プログラミング言語において、リフレクションとはプログラムが自己の構造や振る舞いを調査し、変更する能力です。Moveでは、実行時に値の型を検査することができる限定的な形のリフレクションがあります。これは、同種のコレクションに型情報を保存する必要がある場合や、型がパッケージに属しているかどうかを確認する必要がある場合に便利です。

型リフレクションは標準ライブラリモジュール std::type_name で実装されています。大まかに言うと、 型 T の名前を返す単一の関数 get<T>() を提供します。

実際にやってみる

このモジュールは非常にシンプルで、結果に対して許可される操作は、文字列表現の取得と型のモジュールとアドレスの抽出に限定されています。


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

    // 型 `T` の名前とそのモジュール、アドレスを返す関数
    public fun do_i_know_you<T>(): (String, String, String) {
        let type_name: TypeName = type_name::get<T>();

        // 文字列を借用する方
        let str: &String = type_name.borrow_string();

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

        // 値を消費する方法
        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);
    }
}

参考文献

型リフレクションは言語の重要な部分であり、より高度なパターンのいくつかにおいても重要な役割を果たします。

The Move Book へ戻る