Lua元方法的使用

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 )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值