stepbystep(lua元表与元方法)

stepbystep(lua元表与元方法)

ID:13748753

大小:74.00 KB

页数:7页

时间:2018-07-24

stepbystep(lua元表与元方法)_第1页
stepbystep(lua元表与元方法)_第2页
stepbystep(lua元表与元方法)_第3页
stepbystep(lua元表与元方法)_第4页
stepbystep(lua元表与元方法)_第5页
资源描述:

《stepbystep(lua元表与元方法)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加。假设a和b都是table,通过元表可以定义如何计算表达式a+b。当Lua试图将两个table相加时,它会先检查两者之一是否有元表,然后检查该元表中是否存在__add字段,如果有,就调用该字段对应的值。这个值就是所谓的“元方法”,这个函数用于计算table的和。   Lua中每个值都有一个元表。table和userdata可以有各自独立的元表,而其它数据类型的值则共享其类型所属的单一元表。缺省情况下,table在创建时没有元表,如:   t={}   print(getmetata

2、ble(t)) --输出为nil   这里我们可以使用setmetatable函数来设置或修改任何table的元表。   t1={}   setmetatable(t,t1)   assert(getmetatable(t)==t1)   任何table都可以作为任何值的元表,而一组相关的table也可以共享一个通用的元表,此元表将描述了它们共同的行为。一个table甚至可以作为它自己的元表,用于描述其特有的行为。在Lua代码中,只能设置table的元表,若要设置其它类型值的元表,则必须通过C代码来完成。   1.算术类的元方法:   在下面的示例代码中,将用table来表示集

3、合,并且有一些函数用来计算集合的并集和交集等。1Set={}2localmetatable={}--元表34--根据参数列表中的值创建一个新的集合5functionSet.new(l)6localset={}7--将所有由该方法创建的集合的元表都指定到metatable8setmetatable(set,metatable)9for_,vinipairs(l)do10set[v]=true11end12returnset13end14http://fz.qqq23.com15--取两个集合并集的函数16functionSet.union(a,b)17localres=Set.n

4、ew{}18forkinpairs(a)do19res[k]=true20end21forkinpairs(b)do22res[k]=true23end24returnres25end2627--取两个集合交集的函数28functionSet.intersection(a,b)29localres=Set.new{}30forkinpairs(a)do31res[k]=b[k]32end33returnres34end35http://qq.qqq23.com36functionSet.tostring(set)37locall={}38foreinpairs(set)do39

5、l[#l+1]=e40end41return"{"..table.concat(l,",").."}";42end4344functionSet.print(s)45print(Set.tostring(s))46end4748--最后将元方法加入到元表中,这样当两个由Set.new方法创建出来的集合进行49--加运算时,将被重定向到Set.union方法,乘法运算将被重定向到Set.intersection50metatable.__add=Set.union51metatable.__mul=Set.intersection5253--下面为测试代码54s1=Set.new

6、{10,20,30,50}55s2=Set.new{30,1}56s3=s1+s257Set.print(s3)58Set.print(s3*s1)5960--输出结果为:61--{1,30,10,50,20}62--{30,10,50,20}   在元表中,每种算术操作符都有对应的字段名,除了上述的__add(加法)和__mul(乘法)外,还有__sub(减法)、__div(除法)、__unm(相反数)、__mod(取模)和__pow(乘幂)。此外,还可以定义__concat字段,用于描述连接操作符的行为。   对于上面的示例代码,我们在算术运算符的两侧均使用了table类型

7、的操作数。那么如果为s1=s1+8,Lua是否还能正常工作呢?答案是肯定的,因为Lua定位元表的步骤为,如果第一个值有元表,且存在__add字段,那么Lua将以这个字段为元方法,否则会再去查看第二个值否是有元表且包含__add字段,如果有则以此字段为元方法。最后,如果两个值均不存在元方法,Lua就引发一个错误。然而对于上例中的Set.union函数,如果执行s1=s1+8将会引发一个错误,因为8不是table对象,不能基于它执行pairs方法调用。为了得到更准确的错误信息,我们需要给Set.

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。