lua 元表的补充说明

18 篇文章 16 订阅

1 __index

前面讲过lua元表的作用(详见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})
print(t.k)   --200
print(t.k)   --105,此时不再触发元表

我们访问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关闭时的收尾工作等等。

3 __mode

__mode是弱表引用,如果一个table1,里面还有一个table2对象,那么即使将这个table2赋值为nil,它依然不会被垃圾回收因为table1还存有着对这个对象的引用,显然这样的引用是没有必要的。通过以下代码,你可以认识这一点。

local arr = {}
local temp = {}
arr[1] = temp
temp = nil

print(arr[1])      --还是会打印arr[1]引用的那个表

如果想arr不再引用那个表,则可以对arr设置弱表引用:

local arr = {}
local temp = {}
arr[1] = temp
temp = nil

setmetatable(arr, {__mode = 'v'})

collectgarbage()   --强制垃圾回收
print(arr[1])      --此时为nil

更多详细信息请参考:

https://blog.csdn.net/jiumengdz/article/details/88427895

https://blog.csdn.net/qq_35080184/article/details/83420528

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值