2

私はtolua++を使用していくつかのC++クラスをLuaにエクスポートしています。

各クラスがluaテーブルとしてlua側に「実装」されているという私の理解。したがって、C ++クラスに新しいメソッドを追加する効果を実現できるように、C ++オブジェクトテーブルに新しい(Lua)メソッドを追加することは可能かどうか疑問に思っています。

クラスFoobarをエクスポートしていると仮定します。

LuaではFoobarのメソッドに次のようにアクセスできます。

Foobar:method1()
Foobar:method2()
...

Foobarテーブルの「オブジェクト」に新しいメソッド(newmethod1、newmethod2)を追加できるようにしたいと思います

次の質問があります。

  1. 上記の方法で、エクスポートされたC ++オブジェクトの機能を「拡張」することは可能ですか?
  2. Foobarテーブルに新しい関数を追加するにはどうすればよいですか?(私はLuaに比較的慣れていません)
4

1 に答える 1

3

はい、既存のエクスポートされたクラスに新しいメソッドを追加することは可能です。

Foobarは単なるテーブルなので、他のテーブルと同じようにメソッドをアタッチできます。[1]

Foobar["extra_method"] = function (self, arg1, arg2) print(arg1, arg2) end

そして今、あなたはできる:

Foobar:extra_method(1,2)

1 2表示されます。

[1]tolua++はやや奇妙に動作します。クラスごとに1つのメインテーブルを作成します。これは、Foobarと見なされ、クラスの静的メンバー関数(たとえばFoobar:new()クラスのインスタンスメンバー関数(たとえば、Foobar:method1()可能性が高いもの)の両方を保持します。luaの:演算子はシンタックスシュガーです。a:b()に変換されa.b(a)ます。これは、を呼び出すとFoobar:new()、に置き換えられることを意味します。Foobar:new(Foobar)したがって、self引数はFoobarテーブルです。Foobarタイプのオブジェクトを作成し、そのオブジェクトでmethod1()を呼び出すと、selfそのオブジェクトになります。したがって、Foobarテーブルに新しいメソッドを追加するmethod3、とを実行できますが、前者はエラーになります。したがって、この答えFoobar:method3() obj = Foobar:new(); obj:method3()tolua++で動作します。

編集:コメントに対処する

ここで実際のコードを使用します。したがって、次のようなFoobarのクラス宣言があると仮定します。

class Foobar {
  public:
    void method1();
    static void method2();
};

tolua ++がこのクラスのluaバインディングコードを生成すると、次のメソッドを含むテーブルが提供されます。

  • new()-asを呼び出してFoobar:new()Foobarのインスタンスを作成します。
  • delete()-asを呼び出してinstance:delete()Foobarのインスタンスを破棄します。
  • method1()-instance:method1()インスタンスでmethod1を実行するためにasを呼び出します。
  • method2()-メソッド2Foobar:method2()を実行するためにasを呼び出します。

ただし、tolua ++は実際には2つの異なるテーブルを使用しません(1つはクラス自体にアタッチする必要があるメソッド用で、もう1つはそのクラスのインスタンスのメソッド用です)。代わりに、2つをマージするので、実行することが可能でFoobar:method1()ありinstance:new()、メソッドの使用方法ではありませんが...。したがって、静的メソッドの使用方法とインスタンスメソッドの使用方法に違いはありません。構文的にも同じです。(私は個人的にこれがtolua ++の問題だと感じています。)

例を探している場合は、lua内からこれらの関数を呼び出す方法を次に示します。

obj = Foobar:new()
print( obj:method1() )
obj:delete()
于 2011-01-10T00:55:09.213 に答える