0

関数名を生成して呼び出す必要があります。PHPのようにすることは可能 <?php call_user_func_array(array($object, $method));?>ですか?

4

1 に答える 1

2

4つのオプションがあります。

  1. このシグナルのように、呼び出したいメソッドを作成します。シグナルは、GLib.Signal.emit_by_name(g_signal_emit_by_name)という名前で送信できます。呼び出しはGLibモードからですが、シグナルをサポートする他のモードでも同様の方法が使用される可能性があります。

  2. デリゲートオブジェクトの静的テーブル/ハッシュテーブルをコードで手動で作成します。主な利点は、タイプセーフであるということです。欠点は、各メソッドを2か所に追加する必要があることです。また、すべてのバラモードで動作します。

  3. もう1つのオプションは、valaコンパイラに「gir」バインディングを構築し、GObjectIntrospectionライブラリを使用し関数を呼び出すように指示することです。これははるかに複雑ですが、コンパイラーは使用可能なメソッドのリストを維持します。このメソッドは、GLibモードに固有です。

  4. 最後のオプションは、GLibのGLib.Module.symbol(g_module_symbol)関数を使用してシンボルを検索することです。シンボルの「マングルされた」C名を知っている必要があり、タイプセーフではありません。引数のタイプを正確に一致させ、呼び出し元がどこに行くべきかを気にする必要があります。GIRのオーバーヘッドを回避しますが、GIRとは異なり、どのメソッドが存在するかを知ることはできず、特定のメソッドのみを取得します。このメソッドは、GtkBuilderでシグナルを接続するときに使用されます。GLibの関数について説明しましたがPOSIX.dlsym、同じように使用できます。

于 2012-09-14T08:33:43.677 に答える