博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用__index和__newindex实现默认值表、监控表、只读表
阅读量:5923 次
发布时间:2019-06-19

本文共 1693 字,大约阅读时间需要 5 分钟。

  __index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表。

  带有默认值的表:

setdefault = function(t, v)    setmetatable(t, {__index = function () return v end})ends = {
1, 2, 3}setdefault(s, 0) -- 默认值设为0print(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 = tt = {} --代理表需要为空,因为只有当读写不存在的域时,才会触发__index和__newindexlocal 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 proxyendt = 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 proxyenddays = readOnly{
"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"}print(days[1])days[2] = "Noday"

  上述利用__index和__newindex特性来实现的一些具有特殊表的方法都比较简单易懂,而且很好用。

 

 

 

 

 

转载地址:http://glxvx.baihongyu.com/

你可能感兴趣的文章
走进webpack(2)--第三方框架(类库)的引入及抽离
查看>>
原生开发移动web单页面(step by step)3——App对象
查看>>
如何维护名誉?区块链取证了解一下
查看>>
开启Python3自带的http服务
查看>>
WPF获得全局窗体句柄,并响应全局键盘事件
查看>>
业务中台如何提升研发效率
查看>>
BeetlSQL 2.11.1 发布,Java Dao 工具
查看>>
Flutter 07: 图解基础【登录】页面并学习相关 widget
查看>>
智库说 | 杨滔:未来城市要靠信用和计算能力驱动
查看>>
Dos Attack Windows CVE-2017-0166
查看>>
Java各种常用时间操作方法
查看>>
Android应用开发—RecyclerView绘制蒙层
查看>>
plsqldev工具自动提交
查看>>
使用myeclipse构建maven项目报错:No goals have been specified for this build
查看>>
iOS objc_msgSend尾调用优化详解
查看>>
通过HTTP/2通道实时获取IoT设备状态和数据
查看>>
Scrapy框架--通用爬虫Broad Crawls(下,具体代码实现)
查看>>
如何使项目能够使用 CocoaPods
查看>>
scrapy的安装
查看>>
suse12安装详解
查看>>