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)