LUA.元表学习笔记1

LUA.元表学习笔记1

最近学习lua学习到元表这一块,发现有点迷糊
于是查阅了一部分资料反复敲代码论证,记录一下结果
因为自己也是菜鸟并不保证完全正确,这仅仅是我个人的理解

首先设置原表

-- 普通表
t = {}
-- 元表
mt = {}
-- 把 mt 设为 t 的元表
setmetatable(t, mt)
-- 返回 t 的元表,也就是 mt
getmetatable(t)

元方法 __index
如果一个表 t 拥有元表 mt
当你通过键来访问 t 的时候,如果这个键没有值,Lua那么就会寻找 mt 中的 __index 键
如果__index包含一个表格,Lua会在表格中查找相应的键。

这里我个人的理解是这样的:

t:是一家五金店
mt:是五金店的仓库
__index:是仓库的管理员

你在五金店想买一把螺丝刀
但是五金店那里发现他店里没有螺丝刀了于是他就去仓库那边看看有没有
于是店员到仓库后跟仓库的管理员说我要螺丝刀
管理员就打开仓库拿了把螺丝刀给店员
然后店员拿回来给你

如果没有设置元表那么五金店就没有仓库 他如果有螺丝刀就会给你螺丝刀没有那就没有
如果是仓库没有管理员 那么店员过去的时候 就会发现仓库没有人门是关着的,那么店员回来告诉你没有螺丝刀卖你
如果有管理员但是仓库也没有螺丝刀 那么店员会回来告诉你 还是没有螺丝刀卖你

-- 普通表
t = {}
-- 元表
mt = {}
mt.name = "张三"
-- 把 mt 设为 t 的元表
setmetatable(t, mt)
print(t.name)

-- 输出如下
-- nil

加上 __index 后

-- 普通表
t = {}
-- 元表
mt = {}
mt.name = "张三"
mt.__index = mt
-- 把 mt 设为 t 的元表
setmetatable(t, mt)
print(t.name)

-- 输出如下
-- 张三

如果 __index包含一个函数 的话
Lua就会调用那个函数,table 和 key 会作为参数传递给函数

那是那个五金店员还是那个管理员
函数就是管理员的一个处理思路
比如仓库里有螺丝刀,但是管理员不想给,给了店员一把锤子…
比如仓库里也没有螺丝刀,管理员又去别的地方拿了把螺丝刀
比如仓库里也没有螺丝刀,管理员又去生产车间(元表的元表)看看有没有螺丝刀

-- 普通表
t = {}
-- 元表
mt = {}
mt.name = "张三"
mt.__index = function(table, key)
    print(tostring(table) .. " 中没有 " .. key .. " 这个key哟")
    if mt[key] then
        return tostring(mt) .. " 中 " .. key .. " 的值为 " .. mt[key]
    else
        return tostring(mt) .. " 中也没有 " .. key .. " 这个key哟"
    end
end
-- 把 mt 设为 t 的元表
setmetatable(t, mt)
print("普通表:" .. tostring(t))
print("元表:" .. tostring(mt))
print(t.name)
print(t.newname)

-- 输出如下:
-- 普通表:table: 01400848
-- 元表:table: 014007D0
-- table: 01400848 中没有 name 这个key哟
-- table: 014007D0 中 name 的值为 张三
-- table: 01400848 中没有 newname 这个key哟
-- table: 014007D0 中也没有 newname 这个key哟
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值