热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lua五:语言特性之元表与元方法

元表和元方法:对于表,我们可以使用元表和对应的元方法来定义表之间的操作,如算术操作、关系操作等等

元表和元方法:对于表,我们可以使用元表和对应的元方法来定义表之间的操作,如算术操作、关系操作等等。Lua在创建表时,默认不带元表,可以使用函数setmetatable 来设置或修改任意表的元表,使用函数getmetatable来查看表:

t1 = {}

setmetatable(t, t1)

print( getmetatable(t) == t1)–> true

1、表的算数运算:Lua已经为我们规定好了各种算术操作符的元方法名称,

__add

加法

__sub

减法

__mul

乘法

__div

除法

__idiv

floor除法

__unm

负数

__mod

取模

__pow

幂运算

_-band

按位与

__bor

按位或

__bxor

按位异或

 

s1=Set.new{10,30,40,50}   s2= Set.new {10,30,20,40,50}   –先定义两个表

setmetatable(s1,mt)

setmetatable(s2,mt)    –为两个表创建相同的元表。

mt.__add=Set.union    –定义元方法,一般格式为mt.__add=function()

s3=s1+s2               –s1和s2相加,调用相加的元方法,即调用函数Set.union求两表的并集

print(Set.tostring(s3))       –>{10,20,30,40,50}

 

当然,我们可以修改用于创建集合的函数Set.new,让所有表示集合的表共享一个元表,即将mt设置为函数Set.new所创建的表的元表:

function Set.new (l)–第二个版本

local set = {f}

setmetatable(set,mt)

for _, v in ipairs(l) do

set[v] = true

end

return set

end

在此之后,所有由Set.new创建的集合都具有了一个相同的元表。

 

2、表的关系运算

元表关于关系运算的元方法有:

__eq

等于

__lt

小于

__le

小于等于

其他三个关系运算符没有单独的元方法,Lua语言会将a~=b 转换为not (a==b),a>b 转换为b=b 转换为b<=a。

3、库定义相关元方法

这里介绍两个库定义相关元方法,一个是“__tostring”,将表表示为字符串;还有一个是函数pairs,其也有对应的元方法,我们可以修改表被遍历的方式和为不是表的对象增加遍历的方式。



推荐阅读
author-avatar
dajiang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有