Lua中的每一个值都有或者可以有一个元表,但是table和userdata可以拥有独立的元表,其他类型的值就只能共享其类型所属的元素比如字符串使用~!的是string的元表
!!! Lua在新建table的时候是不会创建metatable的,需要使用setmetatable来设置元表,setmetatable的参数可以是任意table,包括要赋值的table本身,getmetatable可以查看函数是否有元表
-
Arr={}
-
function Arr.addTable(table1,table2) --元表里边的__add方法的重写
-
local ar={} --定义一个table用来盛放差集的数值
-
local m=1 --差集的key值
-
--找出table1中与table2不相同的值
-
for i,v in ipairs(table1) do --用循环嵌套来遍历每一个table1的值与所有table2的值的对比
-
local boo=true --设置控制变量
-
for i1,v1 in ipairs(table2) do
-
if v==v1 then --如果有值相等,那么直接退出,控制变量设置为false 即不是差集数
-
boo=false
-
break
-
end
-
end
-
if boo==true then --如果boo为true 说明是差集数,则将它放在ar表中,key值加一
-
ar[m]=v
-
m=m+1
-
end
-
end
-
--找出table2中与table1不相同的值
-
for i,v in ipairs(table2) do --用循环嵌套来遍历每一个table1的值与所有table2的值的对比
-
local boo=true --设置控制变量
-
for i1,v1 in ipairs(table1) do
-
if v==v1 then --如果有值相等,那么直接退出,控制变量设置为false 即不是差集数
-
boo=false
-
break
-
end
-
end
-
if boo==true then --如果boo为true 说明是差集数,则将它放在ar表中,key值加一
-
ar[m]=v
-
m=m+1
-
end
-
end
-
return ar
-
end
-
-
Arr.mt={} --元表
-
-
function Arr.new(table1) --新建一个table,给table设置元表并返回
-
Arr.mt.__add=Arr.addTable --重写mt_add的方法为addTable
-
setmetatable(table1,Arr.mt) --设置table1的元表为mt
-
return table1
-
end
-
-
-
-
--tostring
-
function Arr.tostring(table1)
-
local str="差集为:{"
-
local stp=""
-
for i in ipairs (table1) do
-
str=str..stp..table1[i]
-
stp=","
-
end
-
return str.."}"
-
end
-
-
function Arr.print(table1)
-
print(Arr.tostring(table1))
-
end
-
-
--测试代码
-
a=Arr.new({1,2,3,56,78,4})
-
b=Arr.new({0,1,2,3,78,56,8,2,90})
-
c=a+b
-
Arr.print(c)
-
--[[
-
得到的结果为
-
差集为:{4,0,8,90}
-
--]]