Cocos2d-x之lua核心编程(第二版)》示例代码注释详解 1
Table of Contents
请尊重原作者的工作,转载时请务必注明转载自: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)