空のテーブルがありますが、__newindexと__indexのメタメソッドはC側から実装されています。テーブルは配列(t [1] = 3、print(t [2])...)として使用され、Cはすべてのアクセスをキャッチします。luaL_refキーによるメタメソッドのシャドウイングの問題
ここでは、gcによって第2のオブジェクトが破棄されないように、別のオブジェクトの参照をこのテーブルに追加するためにluaL_refを使用します。しかし、返された参照は、このテーブルで使用する "仮想"インデックスをシャドウすることができると思います。
たとえば、t [1] = 3は__newindexを呼び出すと予想されますが、lauL_refが1私のテーブルには本当に '1'の要素があり、__newindexはもう呼び出されません。
luaL_refは、テーブルでまだ使用されていないキーを返すことが保証されていますが、テーブルが空のので(メタメタメソッドが常に呼び出されるように)、実際には低い値使用する可能性があります。
この理由で瑕疵はありますか?そうでない場合、どうすればこの問題を回避できますか?
luaL_refを使用しない理由を説明しません。とにかく、あなたと#luaの別の男がメタテーブルについて同じことを提案していたので、それが私の最終的なアプローチになると思います。 –
@LorenzoPistone: 'luaL_ref'を使って問題を述べました。テーブルのエントリを取り上げて、メタデータにアクセスしてしまうのです。メタメソッドが機能するには、テーブルは空のままでなければなりません。したがって、これらの参照をフックするには別のテーブルを使用する必要があります。これはLuaの標準的な手順です。 –