lua元表(简单例子)

Set = {}
Set.mt = {}--定义普通的表作为元表,为了避免命名污染直接放在Set内部
function Set.new(t)
    local set = {}
    setmetatable(set, Set.mt)--一组相关的表共享一个metatable(通过这个可以描述他们共同的行为),一个表也可以是自身的metatable(描述私有行为)
    for _, l in ipairs(t) do set[l] = true end
    return set
end

function Set.union(a, b)
    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.intersection(a, b)
    local res = Set.new{}
    for k in pairs(a) do
        res[k] = b[k]
    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}
print(getmetatable(s1))
print(getmetatable(s2))
Set.mt.__add = Set.union--给元表设置__add函数
--当Lua试图对两个表进行相加时,会检查两个表是否有一个表有metatable,并且检查metatable是否有__add域,如果有直接调用元方法计算
s3 = s1 + s2
Set.print(s3)
Set.mt.__mul = Set.intersection
Set.print((s1 + s2)*s1)

 

posted @ 2015-03-09 15:44  zzyoucan  阅读(266)  评论(0编辑  收藏  举报