《Cocos2d-x之lua核心编程(第二版)》示例代码注释详解 1


请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com

用元表针对一个table实现+操作

Set = {} -- 首先声明一个名字为"Set"的表,这个Set表,将会作为一个“类”。我们称之为“Set类”
Set.mt = {} --[[为了避免命名空间污染,在Set表内部定义一个名为“mt”;类型为表的元素项。这个mt表将作为“表征Set类
                的实例对象的表”的元表--]]

--[[
Set表内部定义一个名为new,类型为函数的元素项。这个函数用来生一个“表征Set类的实例对象的表”。
从实现功能来看。这个函数类似于C++,Java中的
--]]
function Set.new(t)
    local set = {}            -- 生成一个表set,这个set表就等价于Set类的一个对象实例
    Set.mt.__add = Set.union  -- 表Set.mt的元方法__add就是类Set的union方法
    setmetatable(set, Set.mt) -- 指定表set的的元表为Set.mt
    for i, v in ipairs(t) do  -- 遍历传进来的table类型的参数t的每一项元素,然后将t的每一项元素的实值,
        set[v] = true         -- 作为set表的键值
    end
    return set                -- 返回表set,即返回Set类的一个对象实例
end

-- 合并两个集合a和b并且形成一个新Set对象
function Set.union(a, b)
    local res = Set.new{}
    -- k short for key
    for k in pairs(a) do     -- 遍历参数a的每一个键值,从new方法可以看到,这个a的键值就是new方法的参数t的实值
        res[k] = true
    end
    for k in pairs(b) do     -- 遍历参数b的每一个键值,从new方法可以看到,这个b的键值就是new方法的参数t的实值
        res[k] = true
    end
    return res               -- 完成两个循环之后,res表中就已经含有a和b的所有键值了。等同于合并了两个集合
end

-- 把某一个Set对象格式化成字符串并返回
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}
s3 = s1 + s2
Set.print(s3)