Unity热更新 Lua高级(三)元表详解

一、元表作用与性质

1.作用:Lua提供了元表与元表方法来修改一个值的行为,使其在面对一个“非预定义”的操作时执行一个指定的操作。

二、算数与关系类元方法

元表的加法操作

--第一步:定义“原始表”
tab_1={10,20,50}
tab_2={35,70,80}
--第二部:定义“元表”
setTable={}
--第二部:定义“元表”的加法函数
function setTable.Adding( tab1,tab2 )
    local addTableRes={}
    for i,v in pairs(tab1) do
        if (v==nil) then
            break
        end
        addTableRes[i]=tab1[i]+tab2[i]
    end
    return addTableRes
end
--第三步:设置元方法
setTable.__add=setTable.Adding --.__add元表的加法定义

--第四步:设置元表
setmetatable(tab_1,setTable) --setmetatable(t1,t2)设置t1的元表为t2
setmetatable(tab_2,setTable)
--第五步:测试输出
tabReault =tab_1+tab_2
--输出结果
for i=1,#tabReault do
    print(tabReault[i])
end

三、库定义类元方法

  • __tostring (print时调用)
  • __metatable (设置后不可修改元表) setTable.__metatable="不能修改shoul受保护的元表"
--第一步:定义“原始表”
tab_1={10,20,50}
--第二部:定义“元表”
setTable={}
--第二部:定义“元表”的直接打印的元方法
function setTable.ToString(tab)
    local tabResult={}
    for i,v in pairs(tab) do
        tabResult[#tabResult+1]=v
       -- print(v)
    end
    return table.concat(tabResult,",")
end
--第三步:设置元方法
setTable.__tostring =setTable.ToString 

--第四步:设置元表
setmetatable(tab_1,setTable) --setmetatable(t1,t2)设置t1的元表为t2
--第五步:测试输出
--输出结果
    print(tab_1)

四、Table访问类元方法

  • __index(查询table) 返回查出索引的提示信息
tabTable={str1="Unity",str2="C#"}
--定义元表核心函数
local setTable={}
--提示信息
function setTable.tipNotFinding(  )
    return "您查询Table中没有对应的记录!"
end

--设置元方法
setTable.__index=setTable.tipNotFinding
--设置原始表对应的元表
setmetatable(tabTable,setTable)
print(tabTable[str3])
  • 元表的缩写
tabTable={str1="Unity",str2="C#"}
--提示信息
function tipNotFinding(  )
    return "您查询Table中没有对应的记录!"
end
setmetatable(tabTable,{__index=tipNotFinding})
print(tabTable[str3])
  • __newindex:给一个表新字段赋值。

当对一个table中不存在的索引赋值时,解释器就会查找__newindex元方法。如果有这个元方法,解释器就会调用它,而不是执行赋值。

tabTable={str1="Unity",str2="C#"}
--提示信息
function AddValue( tab,k,v )
    print("检测到你给Table添加了新的数据")
end
setmetatable(tabTable,{__newindex=AddValue})
tabTable["str3"]="厅长"
print(tabTable["str3"])

  • __newindex中的rawset会继续执行添加操作。
tabTable={str1="Unity",str2="C#"}
--提示信息
function AddValue(tab,k,v)
    rawset(tab,k,v)
    print("检测到你给Table添加了新的数据")
end
setmetatable(tabTable,{__newindex=AddValue})
tabTable["str3"]="厅长"
print(tabTable["str3"])

  • __call相当于定义表方法
tab1={10,20}
function InvokeMethod(tab,num1,num2)
   print("本元表被调用") 
   return num1+num2
end
--设置元表元方法
setmetatable(tab1,{__call=InvokeMethod})
--测试
print("调用的结果=",tab1(tab1[1],tab1[2]))

lua语言教学 已经热更新技术视频教学​pan.baidu.com

 

提取码:c7o0

王者荣耀全栈教学​pan.baidu.com

 

提取码:dhhc

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值