Chapter 17_4 终结器
Lua中的垃圾回收主要是针对Lua对象,但是也可以做一些额外的资源管理工作。
可以为表设定垃圾收集的元方法(对于完全用户数据,则需要使用C API),该元方法称为 终结器。
Lua用"__gc" 元方法实现终结器:
o = {x = "hi" } setmetatable(o , {__gc = function (o ) print (o.x) end } ) o = nil collectgarbage() --> hi -- 触发元方法__gc
如果我们没有对对象进行__gc标记,它就不会终结。
在它之后才给元表加上这个__gc域,那么这个对象是没有被标记需要触发终结器的:
o = { x = "hi"} mt = {} setmetatable(o,mt ) mt.__gc = function(o) print(o.x) end o = nil collectgarbage() --> 不会打印任何东西
在标记__gc域后,还是可以自由地改变其元表中的 “__gc” 域:
o = {x = "hi" } mt = {__gc = true } --先用任何值给它赋值,作为占位符 setmetatable(o, mt ) mt.__gc = function(o) print (o.x) end --再次修改,也是可以的 o = nil collectgarbage() --> hi
当用同一个循环对几个对象进行垃圾回收,调用终结器的顺序和标记对象__gc域的顺序刚好相反。
mt = { __gc = function (o) print (o[1]) end } list = nil for i = 1, 3 do list = setmetatable({i , link = list}, mt ) end list = nil collectgarbage() --> 3 --> 2 --> 1
未完待续.....
以上内容来自:《Lua程序设计第二版》和《Programming in Lua third edition 》