Lua操作符重载
发布时间:2020-12-15 00:27:00 所属栏目:大数据 来源:网络整理
导读:我在网上找到一些地方说Lua的操作符是无法重载的,但似乎找不到任何的例子. 有人可以提供一个例子,例如,重载运算符的工作,像..操作符用于字符串连接? 编辑1:对亚历山大·格拉日和亚历山大: 如果操作符重载仅在两个操作数相同并且更改此行为时才起作用,那么
我在网上找到一些地方说Lua的操作符是无法重载的,但似乎找不到任何的例子.
有人可以提供一个例子,例如,重载运算符的工作,像..操作符用于字符串连接? 编辑1:对亚历山大·格拉日和亚历山大: printf = function(fmt,...) io.write(string.format(fmt,...)) end Set = {} Set.mt = {} -- metatable for sets 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) -- THIS IS THE PART THAT MANAGES OPERATOR OVERLOADING WITH OPERANDS OF DIFFERENT TYPES -- if user built new set using: new_set = some_set + some_number if type(a) == "table" and type(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 user built new set using: new_set = some_number + some_set elseif type(b) == "table" and type(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 if getmetatable(a) ~= Set.mt or getmetatable(b) ~= Set.mt then error("attempt to 'add' a set with a non-set value that is also not a number",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 -- now try to make a new set by unioning a set plus a number: s3 = s1 + 8 Set.print(s3) --> {1,10,50} 解决方法
metatable函数仅适用于表,但可以使用debug.metatable来设置字符串metatable …
> mt = {} > debug.setmetatable("",mt) > mt.__add = function (op1,op2) return op1 .. op2 end > ="foo"+"bar" foobar > 另一种方法是使用debug.getmetatable来增加内置字符串metatable(回答下面的评论中的问题): ~ 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 > (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |