lua中每个值都有自己的元表。元表本质上也是一个table,其中存放的key为事件,value为元方法。在这些值进行某些操作(运算,比较,调用…)时,会依次序从每一个值的元表中检索对应的事件中是否存在元方法,如果都不存在的话报错无法执行。
lua中其他类型(number,string…)的元表都无法轻易使用lua修改,这些类型每一种都共用一个元表。table和userdata可以拥有独立的元表(也可以共享元表),一般来说元表都是用来操作表之间的操作。
首先有两个函数setmetatable(table,metatable),设置metatable为table的元表,这个函数只适用于给table设置元表,getmetatable(param)返回param的元表,适用于任何对象~
代码来了!
算了先不来,没啥可写的,接下来是元方法!切记元方法的下划线有两条!
__add
表之间相加的方法,对应+运算,把两个表相加,具体里面函数自己写(不写相加也行,坑队友)
代码来了!
testTable =
{
1,
2,
3,
5,
1
}
testTable2 =
{
7,
2,
3
}
local mt = {}
mt.__add = function(t1,t2)
local temp = {}
for k,v in pairs(t1) do
table.insert(temp, v)
end
for k,v in pairs(t2) do
table.remove(temp)
end
return temp
end
setmetatable(testTable2,mt)
local testTable3 = testTable + testTable2
for k,v in pairs(testTable3) do
print(k,v)
end
F:\>lua test.lua
1 1
2 2
__index
在元表中存放的一个键值对索引方法,当table中不存在key对应的value时,去该table的元表中的__index方法,如果里面也是一个表,就在这个表里找对应key的value,如果是一个方法就执行方法
代码来了!
这个是__index中存了个表
testTable =
{
1,
2
}
local mt = {}
mt.__index = {that = "5"}
setmetatable(testTable,mt)
print(testTable.that)
F:\>lua test.lua
5
这个是__index中存了个方法
testTable =
{
1,
2
}
local mt = {}
mt.__index = function(table,key)
if (key == 'that') then return 6
else return nil end
end
setmetatable(testTable,mt)
print(testTable.that)
F:\>lua test.lua
6
__call
把表当成一个函数调用,里面随便写!
代码来了!
testTable =
{
1,
2
}
local mt = {}
mt.__call = function()
print("Good Function")
end
setmetatable(testTable,mt)
testTable()
F:\>lua test.lua
Good Function
还有一大堆,懒得一个个写了,找了个图
元方法 | 对应功能 |
---|---|
__add | 运算符 + |
__sub | 运算符 - |
__mul | 运算符 * |
__ div | 运算符 / |
__mod | 运算符 % |
__unm | 运算符 -(取反) |
__concat | 运算符 … |
__eq | 运算符 == |
__lt | 运算符 < |
__le | 运算符 <= |
__call | 当函数调用 |
__tostring | 转化为字符串 |
__index | 调用一个索引 |
__newindex | 给一个索引赋值 |