lua之元表
arr={} mt={} --设置arr的元表为mt setmetatable(arr,mt) print(arr) print(mt) print(getmetatable(arr))
有了元表,接下来看操作:
如果想要通过索引查找arr里面的值,但是arr里面没有对应的索引,比如:
arr={} other={x=100} mt= { __index=other --如果arr里面没有对应的索引,那么会到他的元表中来查找对应的索引。 } --设置arr的元表为mt setmetatable(arr,mt) print(arr) print(mt) print(getmetatable(arr)) print(arr.x)
如果索引在元表里面:
arr={} mt= { __index=function(k,i) --k,i相当于arr和mt if i=="x" then print("i==x") elseif i=="y" then print("i==y") else print("i is error") end end } setmetatable(arr,mt) print(arr.x)
元方法示例测试:
a={1,2,3}
b={2,5,6}
c={1,2,3}
mt={}
--相当于C++的运算符重载
--重载加法
mt.__add=function(a,b)
local count=#a
local res={}
for i=1,count do
res[i]=a[i]+b[i]
end
return res
end
--重载减法
mt.__sub=function(a,b)
local count=#a
local res={}
for i=1,count do
res[i]=a[i]-b[i]
end
return res
end
--重载乘法
mt.__mul=function(a,b)
local count=#a
local res={}
for i=1,count do
res[i]=a[i]*b[i]
end
return res
end
--重载除法
mt.__div=function(a,b)
local count=#a
local res={}
for i=1,count do
res[i]=a[i]/b[i]
end
return res
end
--重载等于
mt.__eq=function(a,b)
local count=#a
for i=1,count do
if a[i]==b[i] then
goto END
else
return false
end
::END::
end
return true
end
--设置原方法
setmetatable(a,mt)
setmetatable(b,mt)
setmetatable(c,mt)
--遍历所有元素函数
traverse=function(x)
local count=#x
for i=1,count do
io.write(x[i]," ")
end
io.write("\n")
return x
end
local result_one=a+b
local result_two=a-b
local result_three=a*b
local result_four=a/b
traverse(result_one)
traverse(result_two)
traverse(result_three)
traverse(result_four)
if a==c then
print("a is equal c")
else
print("a is not equal c")
end
if a==b then
print("a is equal b")
else
print("a is not equal b")
end

浙公网安备 33010602011771号