4

Programming in 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}
4

2 に答える 2

6

この割り当てを早すぎます。

mt.__add = Set.union

Set.unionまだ初期化されていないためです。

これを下に移動するSet.unionと、機能します。

同じ理由で、を割り当てる場合mt.__mul、これは以下のようになりますSet.intersection

于 2012-10-14T21:32:31.263 に答える
2

mt適切なメタテーブルとして定義する必要があります:

mt = { __add = Set.union, __mul = Set.intersection, __tostring = Set.tostring }
于 2012-10-14T19:06:25.870 に答える