Lua元表与元方法实例讲解
Lua中提供的元表(metatable)与元方法(metamethod)是一种非常重要的语法,metatable主要用于做一些类似于C++重载操作符式的功能。
Lua中提供的元表是用于帮助lua变量完成某些非预定义功能的个性化行为,如两个table的相加,通过让两者指向同一元表并修改该元表的元方法可以实现该功能。
任何table都可以成为任何值的元表,而一组相关的table也可以共享一个元表。
一些MetaMethod:
__add(a,b) 对应表达式a+b __sub(a,b) 对应表达式a-b __mul(a,b) 对应表达式a*b __div(a,b) 对应表达式a/b __mod(a,b) 对应表达式a%b __pow(a,b) 对应表达式a^b __unm(a) 对应表达式-a __concat(a,b) 对应表达式a..b __len(a) 对应表达式#a __eq(a,b) 对应表达式a==b __lt(a,b) 对应表达式a<b __le(a,b) 对应表达式a<=b __index(a,b) 对应表达式a.b __newindex(a,b,c) 对应表达式a.b=c __call(a,...) 对应表达式a(...)
1、算术类and关系类元方法
先看一个简单的例子:
--我们想让两个分数相加,这是一种非预定义的行为
fraction_a={numerator=2,denominator=3} fraction_b={numerator=4,denominator=7} fraction_op={} --元表
--__add这是metatable,这是lua内建约定的 functionfraction_op.__add(a,b) res={} res.numerator=a.numerator*b.denominator+b.numerator*a.denominator res.denominator=a.denominator*b.denominator returnres end
--将fraction_a,fraction_b的元表设置为fraction_op --其中setmetatable是库函数 setmetatable(fraction_a,fraction_op) setmetatable(fraction_b,fraction_op)
--调用的是fraction_op.__add()函数 fraction_c=fraction_a+fraction_b print(fraction_c.numerator.."/"..fraction_c.denominator) --输出结果 --26/21