私は 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 番目のスクリプトのオブジェクトをスコープ内に保持する方法が必要なだけです。