Lua查找表元素过程(元表、__index方法是如何工作的)

Lua table 的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会触发Lua的一套查找机制——元表,也是凭借这个机制来实现了Lua的类


什么是元表:
给一个table关联元表,当前访问的所访问的键不存在table中时, 会返回元表中的值

local father = {
    name = "韩"
}
local son = {
    desc = "H"
}
setmetatable(son, {
    __index = father ,
    __newindex = function(table, key, value)
            print(key .. " 字段不存在,禁止赋值!");
    end
}) 

print(son.name)
son.money = 1

--输出
--韩
--money 字段不存在,禁止赋值!

__index元方法:
1.在表中查找,如果找到,返回该元素,找不到则继续

2.判断该表是否有元表(操作指南),如果没有元表,返回nil,有元表则继续

3.判断元表(操作指南)中有没有关于索引失败的指南(即__index方法),如果没有(即__index方法为nil),则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值

__newindex元方法:

1.给表的字段赋值时,会在表中查找该字段,如果找到,赋值成功,结束,否则继续

2.判断该表是否有元表,如果没有元表,会在表中添加新的键值对,结束,否则继续

3.判断元表是否有__newindex元方法,如果有,则执行,结束

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值