定义一个集合:
补充 算术类的元方法:
local Set = {}
local mt = {}
function Set.new(t)
local set = {}
setmetatable(set, mt)
for k,v in pairs(t) do
set[v] = true
end
return set
end
设置集合的交集,并集方法
function Set.union(a,b)
local set = Set.new{}
for k in pairs(a) do
set[k] = true
end
for k in pairs(b) do
set[k] = true
end
return set
end
function Set.intersection(a,b)
local set = Set.new{}
for k in pairs(a) do
if b[k] then
set[k] = true
end
end
return set
end
设置集合的元方法:
mt.__add = Set.union
mt.__mul = Set.intersection
测试:
local a = Set.new{2,3,4,5}
local b = Set.new{1,6,3}
local c = a + b
Set.print(c)
local s = a*b
Set.print(s)
同样我们可以设置其他元方法,例如__mul(减)
例如求在集合A中,而不在集合B中的元素
function Set.complementary(a,b)
local set = Set.new{}
for k in pairs(a) do
if not b[k] then
set[k] = true
end
end
return set
end
mt.__sub = Set.complementary
补充 算术类的元方法:
__add(加) ,__sub(减),__mul(乘),__div(除),__unm(相反数),__mod(取模),__pow(乘幂)
关系类的元方法:
__eq(等于),__lt(小于),__le(小于等于)
例如:接着上面的集合代码,求A集合是不是B集合的真子集
function Set.lessthan(a,b)
for k in pairs(a) do
if not b[k] then
return false
end
end
return true
end
mt.__lt = Set.lessthan