1 __index
前面讲过lua元表的作用,尤其对__index有重点讲解。在研究skynet源码时发现了__index新的用法,记录一下。
我们已经知道__index的作用是表查找不到字段时的索引,索引我们见到的__index都是另一个表,实际上__index也可以是一个函数。函数在字段查找不到时触发。
例如下面的代码:
local function fun(t, field)
local a = 200
t[field] = 105
return a
end
local t = setmetatable({}, {__index = fun})
我们访问t.key时,由于没有这个字段,就会触发fun函数。其中传入函数的参数是该表本身,已经要访问的字段名key。注意函数的返回值就是t.key的值200,而不是重新返回t。
我们注意到函数中也给t[filed]赋值了,所以再次访问t.key时为105,而不是200了。
如果我们先赋值t.key = 159,那么打印t.key是多少呢?
仍然还是159,因为t.key已经有值,不会再次触发元表了。
我们可以根据上面的特性,给表的字段一个初始值,再次访问时又设置一个值。
2 __gc
__gc是对象声明周期结束时调用的函数,例如:
setmetatable(tab, {__gc = function() ... end})
当tab生命周期结束时会调用function。这种用法一般用于回收资源,例如socket关闭时的收尾工作等等。