Lua 运算符重载
2010-5-12 11:13:55
收藏:0
阅读:220
评论:2
我在网络上找到了一些关于 Lua 运算符可以重载的地方,但我似乎找不到任何示例。
有人可以提供一个例子,比如重载 + 运算符使其像 .. 运算符一样用于字符串连接吗?
编辑1:对 Alexander Gladysh 和 RBerteig:
如果只有在两个操作数是相同类型时才能重载运算符,并且更改此行为不容易,那么以下代码为什么有效?(我不是说任何冒犯话,我刚开始学习这种语言):
printf = function(fmt, ...)
io.write(string.format(fmt, ...))
end
Set = {}
Set.mt = {} -- 元表适用于集合
function Set.new(t)
local set = {}
setmetatable(set, Set.mt)
for _, l in ipairs(t) do set[l] = true end
return set
end
function Set.union(a, b)
- 这部分管理不同类型的操作符重载
- 如果用户使用:new_set = some_set + some_number 构建新集合
如果类型(a)==“table”且类型(b)==“number” then
print(“building set ...”)
local mixedset = Set.new {}
for k in pairs(a)do mixedset [k] = true end
mixedset [b] = true
return mixedset
- elseif用户使用:new_set = some_number + some_set构建新集合
elseif type(b)==“table”且类型(a)==“number” then
print(“building set ...”)
local mixedset = Set.new {}
for k in pairs(b)do mixedset [k] = true end
mixedset [a] = true
return mixedset
end
如果getmetatable(a)~= Set.mt或
getmetatable(b)~= Set.mt then
error(“尝试使用非集合值和不是数字的非集合值进行'添加'”,2)
end
local res = Set.new {}
for k in pairs(a)do res [k] = true end
for k in pairs(b)do res [k] = true end
return res
end
function Set.tostring(set)
local s = “{”
local sep =“”
for e in pairs(set)do
s = s .. sep .. e
sep =“,”
end
return s ..“}”
end
function Set.print(s)
print(Set.tostring(s))
end
s1 = Set.new {10,20,30,50}
s2 = Set.new {30,1}
Set.mt.__add = Set.union
- 现在尝试通过合并集合和数字来创建新集合:
s3 = s1 + 8
Set.print(s3)--> {1,10,20,30,50}
原文链接 https://stackoverflow.com/questions/2810545
点赞
stackoverflow用户6236
请参阅 Lua 编程手册中的 元表 章节以及《Lua 编程》第二版的元表和元方法章节。
请注意,对于比较运算符的运算符重载,仅当操作数类型相同时才起作用。
2010-05-11 15:48:22
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
metatable
函数只能用于表,但是可以使用debug.metatable
来设置字符串的元表:> mt = {} > debug.setmetatable("", mt) > mt.__add = function (op1, op2) return op1 .. op2 end > ="foo"+"bar" foobar
另一个方法是使用
debug.getmetatable
来扩充内置字符串元表(回答下面评论的问题):~ e$ lua Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio > debug.getmetatable("").__add = function (op1, op2) return op1 .. op2 end > ="foo"+"bar" foobar