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)