lua元表

-- Lua 中用于定义和修改表的行为的重要机制。
-- 每个表可以关联一个元表,元表中包含一些特定的元方法(metamethods),这些元方法定义了表的不同操作行为。
-- 元表可以用于实现运算符重载、自定义表的行为等。
-- 元方法


-- __index: 控制对表中不存在的索引的访问行为。
-- 当试图访问表中不存在的索引时,Lua 会查找元表中的 __index 元方法并执行。

local tb = {}
local meta = {
    __index = function(table, key)
        print("无该索引", key)
    end
}
setmetatable(tb, meta)
print(tb[1]) -- 此时打印 无该索引 ,nil

-- __index 也可以是一张表,
-- 这种用法通常用于实现一种类似于继承或属性的机制,让一个表可以继承另一个表的属性或方法。
local tbChild = {}
local tbBase = {
    ["set"] = "set"
}
setmetatable(tbChild, {
    __index = tbBase
})
print(tbChild["set"])  -- 此时打印set






-- __newindex: 控制对表中不存在的索引的赋值行为。
-- 当试图为表中不存在的索引赋值时,Lua 会查找元表中的 __newindex 元方法并执行
local tb = {}
local meta = {
    __newindex = function (table, key, value)
        print("执行赋值操作,将表里的" .. key .. "对应的值赋值为"..  value)
        rawset(table, key, value)  -- 使用rawset设置键值对,避免无限递归调用
    end
}
setmetatable(tb,meta)
tb[1] = 1  -- 打印 执行赋值操作,将表里的1对应的值赋值为1

-- __newindex 元方法可以是一张表,这种用法通常用于实现高级的数据存储和验证。
-- 当 __newindex 是一个表时,它允许你为不同的键设置不同的赋值行为或进行更复杂的操作。
local tb = {}

local mata = {
    __newindex = {
        name = function(table, value)
            print("将表里的name赋值为".. value)
            rawset(table, "name", value)
        end,
        age = function(table, value)
            print("将表里的age赋值为".. value)
            rawset(table, "age", value)
        end,
    }
}
setmetatable(tb, meta)
tb["name"] = "xxx"  -- 执行赋值操作,将表里的name对应的值赋值为xxx
tb["age"] = 18 --执行赋值操作,将表里的age对应的值赋值为18





-- 一个只读表的设计
local readOnlyTable = {
    name = "Alice",
    age = 30,
}

-- 创建元表,并定义__newindex元方法,阻止赋值操作
local metatable = {
    __newindex = function(table, key, value)
        error("尝试修改只读表中的值:" .. key, 2)
    end
}

-- 将表关联到元表
setmetatable(readOnlyTable, metatable)

-- 尝试修改只读表中的值
readOnlyTable.name = "Bob" -- 会触发错误

全部评论

相关推荐

讲一下我的离职流程,给各位一个小小的参考:开工第二天在开会之后微信上找领导提涨薪,然后紧接着去他的办公室聊,前后聊了没两分钟,主要也就是几句话,我说“这个我想涨薪啊,本来我的基础薪资也就是底薪比其他人来说要少一些” ,然后领导非常理所当然地讲到“我们公司是不可能给你个人单独涨薪的,我们都是集体涨薪”,我听了这句话我就直接站起来往外走了,说“好的,我知道了”,然后他就狠狠地瞪了我一眼,说“你是想那个是吧”,我说“我肯定会优先考虑自己的事情的”,然后就走出办公室了。离开办公室没有两分钟我就把离职信发给他跟人事了,后续是上午发了正式的邮件在的企业微信上。领导关于我的离职微信上只给我回复了“期间工作正常完成好”,然后就沉默了,第二天工作下午也没有任何回应,死掉了一样。插一句不该提的,我这个领导是个npd,年前找我谈过两次话,都是为了稳住我,找你谈话的时候异常热情,现在我离职了一句话也不讲,我踏马养条狗养了一年狗丢了我都会伤心一会儿,踏马我在这儿上班一年要离开了这位老登一句挽留的话也不讲,哎,不要对npd投射太多的情感,这种人根本就没把你当人。第三天我就主动找领导还有人事去交接工作以及问询离职证明,报销,这个月的工资发放等事宜,他也给我回复了,说下周待到周三,以防代码运行不起来哈哈,没想到这么顺利。基本上下周把工作交接一下,然后离职证明和工资拿到就结束这段旅程了,真是惬意。
开工第一帖
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务