利用__index和__newindex实现默认值表、监控表、只读表
2014-07-11 16:00
127 查看
__index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表。
带有默认值的表:
一般访问不存在的域会返回nil,但经过上面代码处理后,访问不存在的域会返回一个默认值。为了实现公用metatable,可以将代码封装如下:
监控表(代理表):
对上述代码进行一些适当的封装,将原始表作为代理表的一个特殊的域对应的值:
只读表:
上述利用__index和__newindex特性来实现的一些具有特殊表的方法都比较简单易懂,而且很好用。
带有默认值的表:
setdefault = function(t, v) setmetatable(t, {__index = function () return v end}) end s = {1, 2, 3} setdefault(s, 0) -- 默认值设为0 print(s.x)
一般访问不存在的域会返回nil,但经过上面代码处理后,访问不存在的域会返回一个默认值。为了实现公用metatable,可以将代码封装如下:
key = {} local mt = {__index = function (t) return t[key] end} function setdefault(t, d) t[key] = d setmetatable(t, mt) end
监控表(代理表):
t = {} --需要监控的表 local _t = t t = {} --代理表需要为空,因为只有当读写不存在的域时,才会触发__index和__newindex local mt = { __index = function (t, k) print("*access to element"..tostring(k)) return _t[k] end, __newindex = function(t, k, v) print("*update of element " .. tostring(k) .. " to " .. tostring(v)) _t[k] = v end } setmetatable(t, mt) t[2] = 'hello' print(t[2])
对上述代码进行一些适当的封装,将原始表作为代理表的一个特殊的域对应的值:
local index = {} local mt = { __index = function (t, k) print("*access to element " .. tostring(k)) return t[index][k] end, __newindex = function (t, k , v) print("*update of element " .. tostring(k) .. " to " .. tostring(v)) t[index][k] = v end } track = function (t) local proxy = {} proxy[index] = t setmetatable(proxy, mt) return proxy end t = track(t)
只读表:
function readOnly(t) local proxy = {} local mt = { __index = t, __newindex = function (t, k, v) error("attemp to uopdaate a read-only table", 2) end } setmetatable(proxy, mt) return proxy end days = readOnly{"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"} print(days[1]) days[2] = "Noday"
上述利用__index和__newindex特性来实现的一些具有特殊表的方法都比较简单易懂,而且很好用。
相关文章推荐
- 利用__index和__newindex实现默认值表、监控表、只读表(转)
- 利用Hook技术实现键盘监控
- 利用 window_onload 实现select默认选择
- 利用Nagios 实现监控Linux/Windows及短信报警的总结
- 利用PHP实现对服务器性能与状态的监控
- 利用snmptools实现cacti自定义监控Windows性能计数器
- 利用 window_onload 实现select默认选择
- 自动化运维之监控篇---利用zabbix自动发现功能实现批量web url监控
- 利用PHP实现对服务器性能与状态的监控
- 利用多线程实现对网站状态的监控
- 利用Linux Shell脚本实现MySQL自动监控和报警
- 利用Hook技术实现键盘监控
- 利用VBS脚本监控CPU,实现邮件报警
- 利用java实现一个简单的远程监控程序
- 利用 window_onload 实现select默认选择
- 利用Hook技术实现键盘监控
- 利用java实现一个简单的远程监控程序
- 利用Windows的命令行工具tasklist和findstr,start结合计划任务实现一种进程监控的方案
- 利用autoindex标签来实现dedecms栏目图标的方法
- Unity 利用协同程序实现场景切换时加载进度的监控