はい、既存のエクスポートされたクラスに新しいメソッドを追加することは可能です。
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()-メソッド2
Foobar:method2()
を実行するためにasを呼び出します。
ただし、tolua ++は実際には2つの異なるテーブルを使用しません(1つはクラス自体にアタッチする必要があるメソッド用で、もう1つはそのクラスのインスタンスのメソッド用です)。代わりに、2つをマージするので、実行することが可能でFoobar:method1()
ありinstance:new()
、メソッドの使用方法ではありませんが...。したがって、静的メソッドの使用方法とインスタンスメソッドの使用方法に違いはありません。構文的にも同じです。(私は個人的にこれがtolua ++の問題だと感じています。)
例を探している場合は、lua内からこれらの関数を呼び出す方法を次に示します。
obj = Foobar:new()
print( obj:method1() )
obj:delete()