using "UnityEngine"
Set={}
local mt={} --集合的元表
--根据参数列表中的值创建一个新的集合
function Set.new(l)--在Set表中定义一个方法new
local set ={}--定义一个表
setmetatable(set,mt)--将mt 设置成set 的元表
for _,v in pairs(l) do--用 _, v这种方式是为了在迭代表 l 之时取v的值而忽略键k
set[v]=true
end
end
--并集操作
function Det.union(a,b)
local retSet = Set.new{}--此处相当于Set.new({})
for v in pairs(a) do retSet[v]=true end
for v in pairs(b) do retSet[v]=true end
return retSet
end
--交集操作
function Set.intersection(a,b)
local retSet = Set.new{}
for v in pairs(a) do retSet[v]=b[v] end
return retSet
end
--打印集合的操作
function Set.toString(set)
local tb = {}
for e in pairs(set) do
tb[#tb+1]=e
end
return "{"..table.concat(tb,",").."}"--列出参数中指定table的数组部分从start位置到end位置的所有元素
end
function Set.print( s )
print(Set.toString(s))
Debug.Log(Set.toString(s))
end
collectgarbage() --强制进行一次垃圾收集
Set={}
local mt={}--集合元表
--根据参数列表中的值创建新集合
function Set,new( l )
local set = {}
setmetatable(set,mt)
for _,v in pairs(l) do set[v]=true end
return set
end
local set1 = Set.new({10,20,30})
local set2=Set.new({1,2})
print(getmetatable(set1))
print(getmetatable(set2))
assert(getmetatable(set1)==getmetatable(set2))--assert(断言)可以将其理解为是异常处理的一种高级形式
mt.__add = Set.union
local set1 = Set.new({10, 20, 30})
local set2 = Set.new({1, 2})
local set3 = set1 + set2
Set.print(set3)
--__newindex元方法与__index类似,__newindex用于更新table中的数据,而__index用于查询table中的数据
Windows = {} -- 创建一个命名空间
-- 创建默认值表
Windows.default = {x = 0, y = 0, width = 100, height = 100, color = {r = 255, g = 255, b = 255}}
Windows.mt = {} -- 创建元表
-- 声明构造函数
function Windows.new(o)
setmetatable(o, Windows.mt)
return o
end
-- 定义__index元方法
Windows.mt.__index = function (table, key)
return Windows.default[key]
end
local win = Windows.new({x = 10, y = 10})
print(win.x) -- >10 访问自身已经拥有的值
print(win.width) -- >100 访问default表中的值
print(win.color.r) -- >255 访问default表中的值
Lua初学者笔记
最新推荐文章于 2024-01-15 14:52:40 发布
本文介绍使用Lua实现集合的基本操作,包括并集、交集,并演示如何通过元表实现集合运算。此外,还展示了如何利用元表来简化对象属性的管理。

2876

被折叠的 条评论
为什么被折叠?



