Lua笔记12 metatable 和metamethod

--[[  获取lua中值对应的元表]]
--[[lua中的每个值都有一套预定义的操作集合。例如:数字相加,连接字符串,在table中插入键值对key-vaule等。但,我们无法将2个table相加,无法对函数比较,也无法调用一个字符串。
这些操作就是lua中的元表及元表方法。

可以通过元表来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作。例如,假如a和b都是table,通过元表可以定义如何计算a+b的值,当lua试图将两个table相加时,过程如下:

先判断a和b两者之一是否有元表;
检查该元表中是否有一个叫__add的字段;
如果找到了该字段,就调用该字段对应的值,这个值对应的是一个metamethod;
调用__add对应的metamethod计算a和b的值。
上述四个步骤就是计算table类型变量a+b的过程。

在Lua中,每个值都有一个元表,table和userdata类型的每个变量都可以有各自独立的元表,而其他类型的值则共享其类型所属的单一元表。还存在一个特例,对于字符串,标准的字符串程序库为所有的字符串都设置了一个元表,而其它类型在默认情况下都没有元表。lua在创建table的时候,不会创建元表。

lua中只能设置table的元表。若要设置其他类型的值的元表,则必须通过c代码来完成 。

在table中,我可以重新定义的元方法有以下几个:
__add(a, b) --加法
__sub(a, b) --减法
__mul(a, b) --乘法
__div(a, b) --除法
__mod(a, b) --取模
__pow(a, b) --乘幂
__unm(a) --相反数
__concat(a, b) --连接
__len(a) --长度
__eq(a, b) --相等
__lt(a, b) --小于
__le(a, b) --小于等于
__index(a, b) --索引查询
__newindex(a, b, c) --索引更新(PS:不懂的话,后面会有讲)
__call(a, ...) --执行方法调用
__tostring(a) --字符串输出
__metatable --保护元表

--]]

--获取metatable

print(getmetatable(10))

print(getmetatable('aa'))

tbA={}
tbmeta={}
print(getmetatable(tbA))

setmetatable(tbA,tbmeta)
print(getmetatable(tbA))
print(tbmeta)


--创建mt,并在创建新对象的时候创建新table。

Set={}
local mt={}

function Set.new(tbTemp)
	local set={}
	setmetatable(set,mt)
	for _,v in pairs(tbTemp) do
		set[v] = true
	end
	return set
end


set1=Set.new({1,2})

for _,v in pairs(set1) do
	print(set1)

end

for _,v in pairs(Set.new({1,2,3,4})) do
	print(v)
end



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值