在阅读 Lua中的编程时,我尝试了本书中给出的操作符重载的示例
Set = {}
mt = {}
mt.__add = Set.union
--create a new set with the values of the given list
function Set.new (l)
local set = {}
setmetatable (set, mt)
for _, v in ipairs (l) do
set [v] = true
end
return set
end
function Set.union (a, b)
local result = Set.new {}
for k in pairs (a) do result [k] = true end
for k in pairs (b) do result [k] = true end
return result
end
function Set.intersection (a, b)
local result = Set.new {}
for k in pairs (a) do result [k] = b[k] end
return result
end
function Set.tostring (set)
local l = {}
for e in pairs (set) do
l[#l + 1] = e
end
return "{" .. table.concat (l, ", ") .. "}"
end
function Set.print (s)
print (Set.tostring (s))
end
s1 = Set.new {10, 20, 30, 50}
s2 = Set.new {30, 1}
Set.print (s1)
Set.print (s2)
s3 = s1 + s2
Set.print (s3)
但是使用最新的lua for windows
我收到以下错误
lua: C:\meta.lua:47: attempt to perform arithmetic on global 's1' (a table value)
stack traceback:
C:\meta.lua:47: in main chunk
[C]: ?
{30, 10, 20, 50}
{1, 30}
答案 0 :(得分:6)
你过早地完成这项任务:
mt.__add = Set.union
因为Set.union
尚未初始化。
将其移至Set.union
下方即可。
出于同样的原因,如果您指定mt.__mul
,则应该低于Set.intersection
答案 1 :(得分:2)
您需要将mt
定义为合适的元表:
mt = { __add = Set.union, __mul = Set.intersection, __tostring = Set.tostring }