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