Set = {}
Set.mt = {}
function Set.new( t )
local set = {}
setmetatable( set, Set.mt )
for _, l in ipairs(t) do set[l] = true end
return set
end
function Set.union( a, b )
if getmetatable( a ) ~= Set.mt or getmetatable( b ) ~= Set.mt then
error("attempt to add a set with a non-set value",2)
end
local res = Set.new{}
for k in pairs(a) do res[k] = true end
for k in pairs(b) do res[k] = true end
return res
end
function Set.intersection( a, b )
local res = Set.new{}
for k in pairs(a) do
res[k] = b[k]
end
return res
end
Set.mt.__le = function( a, b )
for k in pairs( a ) do
if not b[k] then return false end
end
return true
end
Set.mt.__lt = function( a, b )
return a <= b and not ( b <= a )
end
Set.mt.__eq = function( a, b )
return a <= b and b <= a
end
function Set.tostring( set )
local s = "{"
local sep = ""
for e in pairs( set ) do
s = s .. sep .. e
sep = ", "
end
return s .. "}"
end
function Set.print( s )
print( Set.tostring(s))
end
Set.mt.__add = Set.union
Set.mt.__mul = Set.intersection
Set.__tostring = Set.tostring
--算数
s1 = Set.new({10,20,30,50})
s2 = Set.new({30,1})
s3 = s1 + s2
s4 = s3 * s2
Set.print( s3 )
Set.print( s4 )
s6 = Set.new({8})
s5 = s4 + s6
Set.print( s5 )
--关系
t1 = Set.new{2,4}
t2 = Set.new{4,10,2}
print( t1 <= t2 )
print( t1 < t2 )
print( t1 >= t1 )
print( t1 > t1 )
print( t1 == t1 * t2 )
Lua元方法的使用
最新推荐文章于 2022-01-17 23:45:50 发布