一、元表作用与性质
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
提取码:dhhc