2

以前読んだことがあるので、少し驚いています__gc。メタメソッドはユーザーデータに対してのみ呼び出され、テーブルに対しては呼び出されません。(LuaFAQ:__gcおよび__lenメタメソッドがテーブルで機能しないのはなぜですか?

しかし、最近、私はそれを試してみて、それが実際に機能することを発見しました!Lua5.2.1でこのコードを試してください。

do
  local b = setmetatable({a = 1}, {__gc = function(self) print(self.a); end});
end
collectgarbage();

しかし、この変更ログはどこにも見つからないので、少しイライラして使用することを恐れています。

たぶん、誰かが私の提案を証明することができますか?それとも、文書化されていない動作ですか?私の場合、テーブルデストラクタを定期的に作成する方法があると便利です。私の観察が正しければ嬉しいです。

4

1 に答える 1

4

Lua 5.2リファレンスマニュアルのセクション2.5.1は、テーブルがメタメソッドをサポートしていることを示しています__gc。具体的には、

収集時にオブジェクト(テーブルまたはユーザーデータ)をファイナライズするには、ファイナライズのマークを付ける必要があります。メタテーブルを設定し、メタテーブルに文字列「__gc」でインデックス付けされたフィールドがある場合、オブジェクトにファイナライズのマークを付けます。

5.1リファレンスマニュアルの同様のドキュメントには、

C APIを使用して、ユーザーデータのガベージコレクタメタメソッドを設定できます

__gcLua5.2がテーブルのメタメソッドを明示的にサポートするようになったことは明らかです。

于 2012-12-31T00:39:28.530 に答える