1. 元表简介
lua中的每个值都有一个元表,table和userdata可以有各自的元表,而其他类型的值则共享类型中所属的单一元表,lua在创建新的table时不会创建元表。
例如:local t = {}
print(getmetatable(t)) --nil
但是我们可以使用setmetatable来设置或者修改任何table的元表:
local meta = {}
setmetatable(t, meta)
print(getmetatable(t)) --table
2. 元表示例
local mt = {} --定义一个元表
local MyTable = {}
function MyTable.new(value)
local t = {}
setmetatable(t, mt)
for k,v in ipairs(value) do
t[k] = v
end
return t
end
function MyTable.add(a, b)
local t = {}
for k,v in ipairs(a) do
t[k] = a[k] + b[k]
end
return t
end
mt.__add = MyTable.add --除此之外还有__sub(减法), __mul(乘法), __div(除法), __unm(相反数), __mod(取余), __pow(乘幂)等算术方法
mt.__sub = function(a, b) --也可以这么写
local t = {}
for k,v in ipairs(a) do
t[k] = a[k] - b[k]
end
return t
end
local test1 = MyTable.new({1, 2})
local test2 = MyTable.new({3, 4})
local testAdd = test1 + test2
local testSub = test1 - test2
这样我们就重新定义了table的元表,使MyTable创建的table可以直接相加或者减去。