Luaリファレンス 要注意点 ~ガベージコレクト~†
弱いテーブル(ガベージコレクトされやすいテーブル†
- 通常、これらの機能が使われることはありません。
しかし、非常に大きなデータオブジェクトをテーブルに格納し、
これを途中で消したい場合などは、利用する機械があるかもしれません。
- しかし、これをガベージコレクトの対象としたいような場合、
__modeというキー持ったメタテーブルを、テーブルにセットします。
対象のテーブルのメタテーブルに __mode = "k" ならキーが、 __mode = "v"なら値が 、__mode = "kv"なら両方が、ガベージコレクトの対象となります。
a = {}
b = {__mode = "k"} -- このメタテーブルをセットされた場合、そのテーブルのキーが、他から参照されていないオブジェクトの場合のみ、ガベージコレクトの対象とする。という意味。
setmetatable(a, b)
key = {}
a[key] = 3
key = {}
a[key] = 4
collectgarbage() -- ガベージコレクションを実行
for k, v in pairs(a) do
print(k, v)
end
- なお、キーが数値や文字列の場合は、決してガベージコレクトの対象にならないので注意。あくまでオブジェクト(テーブル、ユーザー定義)のみ。
|