2012-10-14 46 views
4

虽然在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} 

回答

6

你使这种分配太早:

mt.__add = Set.union 

因为Set.union尚未初始化。

将此移动到Set.union以下,它将起作用。

出于同样的原因,如果您分配mt.__mul,这应该是下面Set.intersection

2

您需要将mt定义为合适的metatable:

mt = { __add = Set.union, __mul = Set.intersection, __tostring = Set.tostring } 
+0

道歉,我错过了,我所定义的元表 –

+5

这个答案不再有意义的代码的一部分,因为编辑的问题 – finnw