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(" ") 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