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 endreturn set endfunction Set.union(a, b)local res = Set.new{}for k in pairs(a) do res[k] = true endfor k in pairs(b) do res[k] = true endreturn res endfunction Set.intersection(a, b)local res = Set.new{}for k in pairs(a) dores[k] = b[k]endreturn res endfunction Set.tostring(set)local s = "{"local sep = ""for e in pairs(set) dos = s .. sep ..esep = ", "endreturn s .. "}" endfunction 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)