2012-01-01 5 views
2

空のテーブルがありますが、__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は、テーブルでまだ使用されていないキーを返すことが保証されていますが、テーブルが空のので(メタメタメソッドが常に呼び出されるように)、実際には低い値使用する可能性があります。

この理由で瑕疵はありますか?そうでない場合、どうすればこの問題を回避できますか?

答えて

1

luaL_refを一切使用しないことをお勧めします。少なくとも、あなたはあなたのメタテーブルを置いている空のテーブルではありません。おそらく、それをメタテーブル自体、またはレジストリに格納する他の内部テーブルで参照する必要があります。

+0

luaL_refを使用しない理由を説明しません。とにかく、あなたと#luaの別の男がメタテーブルについて同じことを提案していたので、それが私の最終的なアプローチになると思います。 –

+0

@LorenzoPistone: 'luaL_ref'を使って問題を述べました。テーブルのエントリを取り上げて、メタデータにアクセスしてしまうのです。メタメソッドが機能するには、テーブルは空のままでなければなりません。したがって、これらの参照をフックするには別のテーブルを使用する必要があります。これはLuaの標準的な手順です。 –