在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,包含元.角.分三个数据成员,友元函数重载运算符‘+’(加) 和 ‘-’(减),实现货币的加减运算 例如: 请输入元.角 分: ...
随机推荐
- Python之路-pandas包的详解与使用
什么是pandas pandas是一种Python数据分析的利器,是一个开源的数据分析包,最初是应用于金融数据分析工具而开发出来的,因此pandas为时间序列分析提供了很好的支持.pandas是PyD ...
- Python基础入门一文通 | Python2 与Python3及VSCode下载和安装、PyCharm激活与安装、Python在线IDE、Python视频教程
目录 1. 关键词 2. 推荐阅读 2.1. 视频教程 3. 本文按 4. 安装 4.1. 视频教程 4.2. 资源下载 4.3. 安装教程 1. 关键词 Python2 与Python3及VSCod ...
- 使用GDB调试产生多进程的程序
如果一个进程fork了多个进程,这时使用GBD工具对程序进行调试会如何呢? 实际上,GDB 没有对多进程程序调试提供直接支持.例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试 ...
- uboot URL 待填坑
https://blog.csdn.net/funkunho/article/details/52465636 https://www.cnblogs.com/aaronLinux/p/5933309 ...
- 前端每日实战:25# 视频演示如何用纯 CSS 创作一个慧星拖尾效果的 loader 动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/YLRLaM 可交互视频教程 此视频 ...
- python的次方操作
好简单,不需要import任何包 b=a**n就是求a的n次方,如果n=0.5就是开方 如果开方的是负数或者附复数,需要 import math b=math.sqrt(a) 这样
- Python---字符串拼接和严格字符串
BIF内建函数 Python3中提供了多少个内置函数 68 Python3中TUling tuling是不是一样的 严格区别大小 “=”和“==”的运用与区别 - ‘=‘ 是用来赋值的 - ...
- macOS gcc g++ c++ cc
安装完Xcode之后,系统中默认的编译器不再是Gcc系列,编译一些库的时候经常产生问题. 在PATH变量中设置symbol link,把gcc,g++,c++,cc全链接到Gcc系列.
- 【GMOJ6377】幽曲[埋骨于弘川]
Description \(n\in[1,500],k\in[2,10]\). Solution 这是一道有点很有难度的题. 先考虑判断一个数是否在数列\(a\)中.由于每次加的数是在\([0,k)\ ...
- 调试IPV6
从Mac分享IPV6 WIFI的方法: 按住opition + 系统设置中的share 进入 如果被拒了要上诉或者回复审核团队邮件,可以参考这个写: 尊敬的APP审查委员会: 您们好!我们希望将自己开 ...