私は lua C API を使用して、ネイティブ クラスとやり取りするスクリプトを実行しています。実行時の型情報に Qt の MOC を利用しています。これまでのところ、lua が通信できるようにするすべてのクラスの作成、削除、およびインデックス作成を実装しました。
これが私が今できることのスクリプト例です:
myObject = MyClass.new() --creates new userdata
otherObject = OtherClass.new() --creates new userdata
myObject:functionForOthers(otherObject) --method that takes userdata as argument
そのスクリプトでotherObject
は、作成され、スタックに残ります。次に、オブジェクトを引数としてfunctionForOthers()
受け入れるパススルーが渡されます。OtherClass
otherObject
しかし、スタックに置かれたくない場合はどうすればよいでしょうか? 関数呼び出しのスコープ内にのみ存在する無名変数にしたい場合はどうすればよいでしょうか?
myObject = MyClass.new()
myObject:functionForOthers(OtherClass.new())
これは引き続き機能しますが、OtherObject
インスタンスは作成されますが、変数に割り当てられることはなく、スコープが終了するまでスタックに到達できなくなります。これは直接的な問題を引き起こすわけではありませんが、メモリ効率の良い部分が気になります。
これらの操作のバックエンドを処理する多くのネイティブ コードがありますが、その基本的な要点は、それがnew
グローバル テーブルのフィールドでありMyClass
、OtherClass
ネイティブの CreateObject 関数を指すことです。そこから、クラスのインスタンスが作成され、呼び出し後にユーザーデータに格納されますlua_newuserdata()
functionForOthers()
呼び出しは、メソッドが存在する場合に呼び出すネイティブ IndexObject 関数を指すメタメソッドを利用し__index
ます。
匿名のユーザーデータ変数を実装するための基本的なアプローチは何ですか? OtherClass
関数呼び出しが完了するまで、2 番目のスクリプトのオブジェクトをスコープ内に保持する方法が必要なだけです。