Set = {}
Set.mt = {}--定义普通的表作为元表,为了避免命名污染直接放在Set内部
function Set.new(t)
local set = {}
setmetatable(set, Set.mt)--一组相关的表共享一个metatable(通过这个可以描述他们共同的行为),一个表也可以是自身的metatable(描述私有行为)
for _, l in ipairs(t) do set[l] = true end
return set
end function Set.union(a, b)
local res = Set.new{}
for k in pairs(a) do res[k] = true end
for k in pairs(b) do res[k] = true end
return res
end function Set.intersection(a, b)
local res = Set.new{}
for k in pairs(a) do
res[k] = b[k]
end
return res
end 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{, , , }
s2 = Set.new{, }
print(getmetatable(s1))
print(getmetatable(s2))
Set.mt.__add = Set.union--给元表设置__add函数
--当Lua试图对两个表进行相加时,会检查两个表是否有一个表有metatable,并且检查metatable是否有__add域,如果有直接调用元方法计算
s3 = s1 + s2
Set.print(s3)
Set.mt.__mul = Set.intersection
Set.print((s1 + s2)*s1)

最新文章

  1. XML团队介绍发布!
  2. linux matlab2013b 安装教程
  3. Ubuntu 下配置Samba 实现Linux和windows之间文件共享
  4. 图形混合模式 PorterDuff Xfermodes
  5. oracle数据库管理--对象、角色相关查询
  6. redis7--hash set的操作
  7. 修改es最大返回结果数
  8. Swing小技巧总结
  9. Windows安装和使用fftw
  10. 超简单的canvas绘制地图
  11. centos7 lnmp环境部署
  12. 利用canvas实现刮刮乐效果
  13. scala spark-streaming整合kafka (spark 2.3 kafka 0.10)
  14. JavaWeb 之 清理错误的无奈之举
  15. angular5 自定义指令 输入输出 @Input @Output(右键点击事件传递)
  16. 音频管理器(AudioManager)
  17. FTDI通用转USB芯片简述
  18. Go语言学习笔记十三: Map集合
  19. HDU 4597 Play Game(区间DP(记忆化搜索))
  20. list<?>转换成 对应的 class

热门文章

  1. C#使用StreamWriter类写入文件文件
  2. Python 面向对象三(转载)
  3. autocomplete属性在谷歌浏览器不起作用
  4. Linux学习笔记 (二)常用linux命令
  5. mysql中show processlist过滤和杀死线程
  6. poj Muddy Fields
  7. 扩展Unity3D编辑器的脚本模板
  8. EFFECTIVE JAVA 类和接口
  9. 数据结构之shell排序
  10. 捕获网络数据包并进行分析的开源库-WinPcap