当前位置: 首页 > news >正文

Lua metatable metamethod

示例代码

 《programming in lua》里有一个案例很详细,就是写一个集合类的table,其负责筛选出table中不重复的元素并组合成一个新的table。本人按照自己的方式默写了一次,结果发现大差不差,代码如下:

Set = {} --集合--创建一个新集合
function Set.new(t)local set = {}for k,v in ipairs(t) doset[v] = trueendreturn set
end--集合并运算
function Set.union(a,b)local res = Set.new({})for k,v in pairs(a) dores[k] = trueendfor k,v in pairs(b) dores[k] = trueendreturn res
end--集合交运算
function Set.intersection(a,b)local res = Set.new({})for k,v in pairs(a) doif b[k] thenres[k] = trueendendreturn res
end--集合转成字符串
function Set.tostring(set)local res = "{"local temp = ""for k,v in pairs(set) dores=res..temp..ktemp = ","endres=res.."}"return res
endlocal set = Set.new({1,3,4,5,6,3,4,5})
local set2 = Set.new({3,5,7})
local intersectSet = Set.intersection(set,set2)
local unionSet = Set.union(set,set2)
print(Set.tostring(intersectSet)) --{3,5}
print(Set.tostring(unionSet)) --{1,3,4,5,6,7}

算术运算metamethod

将上面每个函数都改写成metamethod的形式,相当于是运算符直接重载,而非显式调用函数名,可以达到同样的目的。赋值加法运算和乘法运算如下:

setmetatable(Set,{__add = Set.union,__mul = Set.intersection,
})--创建一个新集合
function Set.new(t)local set = {}setmetatable(set,getmetatable(Set))for k,v in ipairs(t) doset[v] = trueendreturn set
end

关系运算metamethod

常见的关系运算即等于、小于、大于、大于等于、小于等于,只需要等于、小于、小于等于中的其中两个关系,即可推算出其他所有关系。如果是a大于b则是b小于等于a的运算;如果是a大于等于b则是b小于a的运算。在lua中给了三个关系运算metamethods:__eq(等于),__lt(小于),和__le(小于 等于)给关系运算符赋予特殊的含义。

于是为上面集合覆写关系运算:

--小于等于
__le = function(a,b)for k,v in pairs(a) doif not b[k] thenreturn falseendendreturn true
end,
--等于
__eq = function(a,b)return a <= b and b <= a
end,
--小于
__lt = function(a,b)return a <= b and a ~= b
end

测试代码如下:

local a = Set.new({1,3,4,5,6})
local b = Set.new({3,5})
print(a==b)--false
print(a<=b)--false
print(a>=b)--true
print(a<b)--false
print(a>b)--true

tostring

类似tostring函数也是有相应的metamethod供我们选择的,比如上方的tostring函数,可以设置metatable的元方法__tostring,这样的话就直接print(set)即可了:

setmetatable(Set,{__add = Set.union,__mul = Set.intersection,__tostring = Set.tostring
})
print(intersectSet) --{3,5}
print(unionSet) --{1,3,4,5,6,7}
http://www.lryc.cn/news/296835.html

相关文章:

  • HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-任务管理
  • 中小型网络系统总体规划与设计方法
  • 以管理员权限删除某文件夹
  • JenkinsGitLab完成自动化构建部署
  • JVM 性能调优 - 参数基础(2)
  • 大型软件编程实例分享,诊所门诊处方笺管理系统多台电脑同时使用的软件教程
  • Java基于微信小程序的医院挂号系统
  • 你是在独立思考,还是在被洗脑?
  • 在django中集成markdown文本框
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Slider组件
  • django admin 自定义界面时丢失左侧导航 nav_sidebar
  • JSP原理简述
  • C/C++ - 异常处理
  • 十、项目开发总结报告(软件工程)
  • 在 VMware 虚拟机上安装 CentOS系统 完整(全图文)教程
  • 吉他学习:右手拨弦方法,右手拨弦训练 左手按弦方法
  • 【初识爬虫+requests模块】
  • 微信小程序(三十八)滚动容器
  • Python学习之路-Tornado基础:数据库
  • Golang的for循环变量和goroutine的陷阱,1.22版本的更新
  • List 差集
  • ArcGIS的UTM与高斯-克吕格投影分带要点总结
  • 华为第二批难题一:基于预训练AI模型的元件库生成
  • Android AOSP源码研究之万事开头难----经验教训记录
  • 动态数据源
  • 2024.1.29力扣每日一题——自由之路
  • Qt应用软件【协议篇】UDP示例
  • MyBatis之动态代理实现增删改查以及MyBatis-config.xml中读取DB信息文件和SQL中JavaBean别名配置
  • 百面嵌入式专栏(面试题)内存管理相关面试题1.0
  • SpringMVC 1.请求参数检查 2.全局异常处理 3.请求参数封装为Pojo