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

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

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

 1Set = {} -- 首先声明一个名字为"Set"的表,这个Set表,将会作为一个“类”。我们称之为“Set类”
 2Set.mt = {} --[[为了避免命名空间污染,在Set表内部定义一个名为“mt”;类型为表的元素项。这个mt表将作为“表征Set类
 3                的实例对象的表”的元表--]]
 4
 5--[[
 6Set表内部定义一个名为new,类型为函数的元素项。这个函数用来生一个“表征Set类的实例对象的表”。
 7从实现功能来看。这个函数类似于C++,Java中的
 8--]]
 9function Set.new(t)
10    local set = {}            -- 生成一个表set,这个set表就等价于Set类的一个对象实例
11    Set.mt.__add = Set.union  -- 表Set.mt的元方法__add就是类Set的union方法
12    setmetatable(set, Set.mt) -- 指定表set的的元表为Set.mt
13    for i, v in ipairs(t) do  -- 遍历传进来的table类型的参数t的每一项元素,然后将t的每一项元素的实值,
14        set[v] = true         -- 作为set表的键值
15    end
16    return set                -- 返回表set,即返回Set类的一个对象实例
17end
18
19-- 合并两个集合a和b并且形成一个新Set对象
20function Set.union(a, b)
21    local res = Set.new()
22    -- k short for key
23    for k in pairs(a) do     -- 遍历参数a的每一个键值,从new方法可以看到,这个a的键值就是new方法的参数t的实值
24        res[k] = true
25    end
26    for k in pairs(b) do     -- 遍历参数b的每一个键值,从new方法可以看到,这个b的键值就是new方法的参数t的实值
27        res[k] = true
28    end
29    return res               -- 完成两个循环之后,res表中就已经含有a和b的所有键值了。等同于合并了两个集合
30end
31
32-- 把某一个Set对象格式化成字符串并返回
33function Set.tostring(set)
34    local s = "{"
35    local sep = ""
36    for e in pairs(set) do
37        s = s .. sep .. e
38        sep = ", "
39    end
40    return s .. "}"
41end
42
43function Set.print(s)
44    print(Set.tostring(s))
45end
46
47-- 测试
48s1 = Set.new{10, 20, 30, 50}
49s2 = Set.new{30, 1}
50s3 = s1 + s2
51Set.print(s3)