2012-10-14 80 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