c++ - LuaPlus Metatablesの初心者向け質問

c++ lua

私はLua / LuaPlusを初めて使用し、メタテーブルの動作を理解しようとしています。

マニュアルから取ったこのコードでは:

LuaObject metaTableObj = state->GetGlobals().CreateTable("MultiObjectMetaTable");
metaTableObj.SetObject("__index", metaTableObj);
metaTableObj.RegisterObjectFunctor("Print", &MultiObject::Print);


最初の行では新しいテーブルを作成していますが、2番目の行は少し混乱しています。作成したばかりのこのテーブルでは、キー__indexの要素をテーブル自体に設定しています。なぜ__indexがキーとして選択され、テーブルの要素をテーブル自体と等しくなるように設定するのですか?

次に、コードの次のセクションで:

MultiObject obj1(10);
LuaObject obj1Obj = state->BoxPointer(&obj1);
obj1Obj.SetMetaTable(metaTableObj);
state->GetGlobals().SetObject("obj1", obj1Obj);


C++オブジェクトを作成し、BoxPointer呼び出しを介してそのアドレスをLuaObjectに関連付け、Print関数を使用できるようにメタテーブルを設定します。

しかし、最後の行では、「obj1」というグローバルLua変数を作成しているだけですか?この時点で、「obj1」と「MultiObjectMetaTable」はグローバルLua変数になりますか?
答え
これは標準のLuaではありません。私が慣れていないC++ラッパーを使用しているようですが、推測はできます


最初の行では新しいテーブルを作成しますが、2行目は
少し混乱します。作成したばかりのこのテーブルでは、
キー__indexが要素自体と等しい要素。なぜ__indexなのか
キーとして選択され、なぜテーブルの要素を
テーブル自体?


__indexは、メタテーブルを使用する場合の特別なキーです。テーブルtがあり、たとえばfooのキーでインデックスを作成しようとすると、当然、そのキーに関連付けられた値が返されます。しかし、そこには何もないと言うことができます。通常、何もない場所にインデックスを付けようとすると、nilが返されます。

しかし、特別なキー__indexを含むメタテーブルがある場合はそうではありません。 __index関数またはテーブルを備えたメタテーブルがある場合、それを使用して値を見つけます。ここで行うように__indexに割り当てられたテーブルがある場合は、そのテーブルを調べて、指定したキーの値を返します。これにより、継承のような動作を実現できます。つまり、テーブルtにこの値がない場合、代わりに、この他のテーブルの値がデフォルトになります。

But for the last line, is that just creating a global Lua variable called "obj1"? At this point "obj1" and "MultiObjectMetaTable" will be global Lua variables?

先ほど触れたように、これは標準のLuaではないので、そこで何が起こっているのか完全にはわかりません。 (ただし、C++とLuaの混合はトリッキーになる可能性があるため、Luaを学習している間は、Cインターフェースを使用して実際に何が起こっているのかを理解できるようにする方がよいでしょう。理解したら、より自動化されたソリューションに進むことができます)
関連記事

c++ - 明示的な型変換の要件

c++ - ペアベクトルc++の上限

c++ - setjmpがスタックを保存しないのはなぜですか?

c++ - coutをキャプチャして関数にリダイレクトする

c++ - Eclipseを使用してMySQLをC++に接続しますか?

c++ - C++用のどのXSLTプロセッサーですか?

c++ - オブジェクト指向プログラミング-メンバーとしての変数、またはグローバルとしてのヘッダーのみ?

c++ - TinyXmlパーサーはファイルを正しくロードすることを拒否します

c++ - shared_ptrでラムダをブーストする

c++ - C++ / CLIを使用したネイティブC++テンプレートクラスのラップ