利用__index和__newindex实现默认值表、监控表、只读表
__index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表。
带有默认值的表:
setdefault = function(t, v)
setmetatable(t, {__index = function () return v end})
end s = {, , }
setdefault(s, ) -- 默认值设为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[] = 'hello'
print(t[])
对上述代码进行一些适当的封装,将原始表作为代理表的一个特殊的域对应的值:
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", )
end
} setmetatable(proxy, mt)
return proxy
end days = readOnly{"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"}
print(days[])
days[] = "Noday"
上述利用__index和__newindex特性来实现的一些具有特殊表的方法都比较简单易懂,而且很好用。
利用__index和__newindex实现默认值表、监控表、只读表的更多相关文章
- 利用__index和__newindex实现默认值表、监控表、只读表(转)
		__index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表. 带有默认值的表: setdefau ... 
- Lua中__index和__newindex实践
		[具有默认值的table] 我们都知道,table中的任何字段的默认值都是nil,但是通过元表,我们可以很容易的修改这一规定,代码如下: function setDefault(tb, default ... 
- Spring Cloud实战之初级入门(四)— 利用Hystrix实现服务熔断与服务监控
		目录 1.环境介绍 2.服务监控 2.1 加入依赖 2.2 修改配置文件 2.3 修改启动文件 2.4 监控服务 2.5 小结 3. 利用hystrix实现消费服务熔断 3.1 加入服务熔断 3.2 ... 
- C# DateTime的11种构造函数  [Abp 源码分析]十五、自动审计记录  .Net 登陆的时候添加验证码  使用Topshelf开发Windows服务、记录日志  日常杂记——C#验证码  c#_生成图片式验证码  C# 利用SharpZipLib生成压缩包  Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
		C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ... 
- 驱动开发:内核监控Register注册表回调
		在笔者前一篇文章<驱动开发:内核枚举Registry注册表回调>中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监 ... 
- 利用jquery.validate以及bootstrap的tooltip开发气泡式的表单校验组件
		表单校验是页面开发中非常常见的一类需求,相信每个前端开发人员都有这方面的经验.网上有很多成熟的表单校验框架,虽然按照它们默认的设计,用起来没有多大的问题,但是在实际工作中,表单校验有可能有比较复杂的个 ... 
- 数据库级别DML操作监控审计、表触发器/对象触发器
		使用触发器记录DML,使用触发器记录表的DML 数据库级别DML操作监控审计.表触发器/对象触发器 --创建记录表 CREATE TABLE T_SHALL_LOG ( ID , ) , EVTIME ... 
- C# 利用mysql.data 在mysql中创建数据库及数据表
		C# 利用mysql.data 在mysql中创建数据库及数据表 using System; using System.Collections.Generic; using System.Linq; ... 
- 利用网络流传的WebShell默认密码库寻找WebShell
		声明:本文提到的技术,仅可用作网络安全加固等合法正当目的.本文作者无法鉴别判断读者阅读本文的真实目的,敬请读者在本国法律所允许范围内阅读本文,读者一旦因非法使用本文提到技术而违反国家相关的法律法规,所 ... 
随机推荐
- 在ArcGIS空间数据库中增加点数据的方法
			1.新建一个mxd(ArcMAP)文件 2.从ArcCatalog中把要编辑的图层拖到ArcMAP中 3.从ArcCatalog中拖一个参照图层到ArcMAP中,比如临沂市的县级区划图 4.打开Edi ... 
- Ninx虚拟主机的配置
			1.配置ip ifconfig eth0 192.168.1.7 netmask 255.255.255.0 ifconfig eth0 192.168.1.17 netmak 255.255.255 ... 
- VS2013中Python学习笔记[Django Web的第一个网页]
			前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ... 
- The main difference between Java & C++(转载)
			转载自:http://stackoverflow.com/questions/9192309/the-main-difference-between-java-c C++ supports point ... 
- 【转载】UEditor前端配置项说明
			UEditor 的配置项分为两类:前端配置项 和 后端配置项 后端配置项具体看这个文档L:后端配置项说明 本文档介绍如何通过设置前端配置项,定制编辑器的特性,配置方法主要通过修改ueditor.con ... 
- 高大上技术之sql解析
			Question: 为何sql解析和高大上有关系?Answer:因为数据库永远都是系统的核心,CRUD如此深入码农的内心...如果能把CRUD改造成高大上技术,如此不是造福嘛... CRUD就是Cre ... 
- ecshop利用.htaccess实现301重定向的方法
			实现方法如下(空间必须支持对目录中的.htaccess文件解析) 打开 .htaccess 找到 RewriteEngine on 它的下方添加 RewriteCond %{HTTP_HOST} ^需 ... 
- ECSHOP后台SQL查询提示错误 this sql May contain UPDATE,DELETE,TRUNCATE,ALTER,DROP,FLUSH,INSERT
			一).首先说一下错误现象:市面上流行的绝大部分ECSHOP模板,安装的时候都需要执行一段或几段SQL语句来修改数据结构或者初始化一些数据.大多数ECSHOP管理员为了省事,都会通过 “ECSHOP后台 ... 
- MX5 ADB 链接error: device not found
			这个问题郁闷了好久,因为事情比较忙也没时间解决.每次是开启360 一键 root 勉强调试.今天狠下心把它解决了.解决办法有以下几个步骤: 1.连接方式改成 “内置光盘”,这样手机第一次连接会安装驱动 ... 
- 文件上传限制大小 dotnet/C#
			private void Button1_Click(object sender, System.EventArgs e) { if (File1.PostedFile != null) { //上传 ... 
