関数名を生成して呼び出す必要があります。PHPのようにすることは可能
<?php call_user_func_array(array($object, $method));?>
ですか?
1 に答える
4つのオプションがあります。
このシグナルのように、呼び出したいメソッドを作成します。シグナルは、GLib.Signal.emit_by_name(g_signal_emit_by_name)という名前で送信できます。呼び出しはGLibモードからですが、シグナルをサポートする他のモードでも同様の方法が使用される可能性があります。
デリゲートオブジェクトの静的テーブル/ハッシュテーブルをコードで手動で作成します。主な利点は、タイプセーフであるということです。欠点は、各メソッドを2か所に追加する必要があることです。また、すべてのバラモードで動作します。
もう1つのオプションは、valaコンパイラに「gir」バインディングを構築し、GObjectIntrospectionライブラリを使用して関数を呼び出すように指示することです。これははるかに複雑ですが、コンパイラーは使用可能なメソッドのリストを維持します。このメソッドは、GLibモードに固有です。
最後のオプションは、GLibのGLib.Module.symbol(g_module_symbol)関数を使用してシンボルを検索することです。シンボルの「マングルされた」C名を知っている必要があり、タイプセーフではありません。引数のタイプを正確に一致させ、呼び出し元がどこに行くべきかを気にする必要があります。GIRのオーバーヘッドを回避しますが、GIRとは異なり、どのメソッドが存在するかを知ることはできず、特定のメソッドのみを取得します。このメソッドは、GtkBuilderでシグナルを接続するときに使用されます。GLibの関数について説明しましたが
POSIX.dlsym
、同じように使用できます。