在Lua中进行运算符重载
在C++里面运算符是可以重载的,这一点也是C++比较方便的一个地方。在Lua中其实也是可以模拟出运算符的重载的。
在Lua中table中元素的运算都是和一个叫做元表有关的,在一个table型的变量上都有一个元表,在元表中存放着该变量的
元函数,在进行运算是,就是利用元表中的这些元函数进行的,比如对两个元素进行加法操作,实际上就是调用在元表中
的一个元函数__add()来实现的。所以通过对这种情况的了解,我们可以很方便的对table元素的元表进行重新的设定,
从而实现重载运算符的目的。
并且table可以用来模拟非常多的数据结构,这样就使得Lua的重载可以发挥出非常强大的实力。
下面以定义一个集合类型为例来演示Lua 1 Set = { 2 ops = {}
function Set.new (data)
local set = {}
setmetatable(set, ops)
for _, value in ipairs(data) do set[value] = true end
return set
end function Set.union (a, b)
local set = {}
for k in ipairs(a) do set[k] = true end
for k in ipairs(b) do set[k] = true end
return set
end function Set.tostring(set)
local l = {}
for e in pairs(set) do
l[#l + ] = e
end
return "{" .. table.concat(l, ", ") .. "}"
end function Set.equal (a, b)
for k in ipairs(a) do
if not b[k] then
return false
end
end
return true
end function override()
ops.__add = Set.union
ops.__tostring = Set.tostring
ops.__eq = Set.equal
end
40 override()
s1 = Set.new ({, , , , })
s2 = Set.new ({, , , , }) s3 = s1 + s2 print (s3) if s1 == s2 then
print ("s1 == s2")
else
print ("s1 ~= s2")
end
这样就可以实现对运算符的一个简单重载,可以重载的方法还有很多,比如
__add: 对+进行重载
__sub: 对-进行重载
__mul: 对*进行重载
__div: 对/进行重载
__unm: 对相反数进行重载
__mod: 对%进行重载
__pow: 对^进行重载
__concat: 对连接操作符进行重载
__eq: 对==进行重载
__lt: 对<进行重载
__le: 对<=进行重载
__tostring: 类似于C++中对<<的重载 只要做了该重载,在使用print时就会使用对应的函数做处理后再输出
在Lua中进行运算符重载的更多相关文章
- C++中的运算符重载注意事项
1.C++中的运算符重载的方式有三种: a.类成员函数重载 b.友元函数重载 c.普通函数重载 注意: a.我们主要使用的方式主要是用:类成员函数和友元函数来实现运算符的重载. b.其实用普通函数理论 ...
- Lua中..和#运算符的用法
Lua中..和#运算符的用法 样例 试试以下的样例就明确了在Lua编程语言提供的其它运算符: a = "Hello " b = "World" print(&q ...
- c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑
- c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...
- C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++中的运算符重载
首先思考以下几个问题: 1.什么是运算符重载? 2.为什么要重载运算符,它有什么用? 3.可以重载哪些运算符? 4.重载运算符有哪些规则? 一.基本概念 我们在程序中使用各种操作符,比如加(+).赋值 ...
- C++中的运算符重载练习题
1.RMB类 要求: 定义一个RMB类 Money,包含元.角.分三个数据成员,友元函数重载运算符‘+’(加) 和 ‘-’(减),实现货币的加减运算 例如: 请输入元.角 分: ...
随机推荐
- 如何官网下载chrome谷歌浏览器离线安装包
目录 1. 下载步骤 2. 将语言更改为中文 3. 插件 3.1. chrome 网上应用店 3.1.1. google-access-helper 4. 更新失败 1. 下载步骤 注意 需要梯子才能 ...
- nginx-博客阅读笔记记录-20190916
Nginx 入门学习教程 Ng官网解释: nginx [engine x]是最初由Igor Sysoev编写的HTTP和反向代理服务器,邮件代理服务器和通用TCP / UDP代理服务器. 维基百科解释 ...
- alert(1) to win 11
- Wannafly挑战赛27 D绿魔法师
链接Wannafly挑战赛27 D绿魔法师 一个空的可重集合\(S\),\(n\)次操作,每次操作给出\(x,k,p\),要求支持下列操作: 1.在\(S\)中加入\(x\). 2.求\[\sum_{ ...
- bzoj5016 & loj2254 [Snoi2017]一个简单的询问 莫队
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5016 https://loj.ac/problem/2254 题解 原式是这样的 \[ \su ...
- MTV和MVC的区别
著名的MVC模式:方便解藕 所谓的MVC就是把web应用分为三层 1.模型层: model 负责业务对象和数据库的对象(ORM)的映射 2.视图层 views 负责与用户的交互(书 ...
- -bash: findstr: command not found 问题解决
今天有个任务,需要获取apk的版本信息,百度之后说是之下下面的命令就行 adb shell dumpsys package com.baidu.searchbox | findstr versionC ...
- PB系统颜色值
Colour Red Green Blue 值黑色 Black 0 0 0 0白色 White 255 255 255 16777215灰色 Gray 192 192 192 12632256深灰色 ...
- Android解析编译之后的所有文件(so,dex,xml,arsc)格式
我们在之前一篇一篇介绍了如何解析Android中编译之后的所有文件格式,所有的工作都完成了,这里我们就来做个总结,我们为什么要做这些工作: 第一篇:解析so文件格式 点击进入 这里我们解析so文件,主 ...
- Android逆向之旅---基于对so中的section加密技术实现so加固
一.前言 好长时间没有更新文章了,主要还是工作上的事,连续加班一个月,没有时间研究了,只有周末有时间,来看一下,不过我还是延续之前的文章,继续我们的逆向之旅,今天我们要来看一下如何通过对so加密,在介 ...