《Programming in Lua 3》读书笔记(十)
Part Ⅱ
e.g.
t = {}
print(getmetatable(t)) --nil
e.g.
t1 = {}
setmetatable(t,t1)
print(getmetatable(t) == t1) --ture
print(getmetatable("ss")) -- table
print(getmetatable(10)) --nil
e.g.
Set = {}
local mt = {} --metatable for setsfunction Set.new(l) --新建一个set,初始化并且设置其元表local set = {} setmetatable(set,mt)for _ v in ipairs(l) do set[v] = true endreturn set
end
s1 = Set.new{10,20,11,13}
s2 = Set.new{30,1}
print(getmetatable(s1)) --table: 0x7fa1eb4093a0
print(getmetatable(s2)) --table: 0x7fa1eb4093a0
--定义Set.union
function Set.union( a,b )local res = Set.new{}for k in pairs(a) dores[k] = trueendfor k in pairs(b) dores[k] = trueendreturn res
end
--定义 Set.intersection
function Set.intersection( a,b )local res = Set.new{}for k in pairs(a) dores[k] = b[k]endreturn res
end
mt.__mul = Set.intersection
function Set.union( a,b )if getmetatable(a) ~= mt or getmetatable(b) ~= mt thenerror("xxx",2) --注意这里的参数是2,表示是提醒用户是传递的参数有问题local res = Set.new{}for k in pairs(a) dores[k] = trueendfor k in pairs(b) dores[k] = trueendreturn res
end
s = Set.new{1,2,2}
print(s) --table: 0x7f8349403d30
print(getmetatable(s)) --table: 0x7f8349409fd0
--to string
function Set.tostring( set )local l = {}for e in pairs(set) dol[#l + 1] = eendreturn "{" .. table.concat(l," , ") .. "}"
end
mt.__tostring = Set.tostring
print(s) --{1,2,2}
e.g.
mt.__metatable = "cannot change"
s1 = Set.new{}
print(getmetatable(s1)) --cannot change
e.g.
setmetatable(s1,mt) --error:cannot change a protected metatable
function new(o)setmetatable(o,mt)return o
end
mt.__index = function(_,key)return prototype[key]
end
w = new{x = 10,y = 20}
print(w.width) --100
e.g.
function setDefault( t,d )local mt = {__index = function ( ... )return dend}setmetatable(t,mt)
end
tab = {x = 10,y = 20}
print(tab.x,tab.z) --10,nil
setDefault(tab,0)
print(tab.x,tab.z) --10,0
e.g.
local mt = {__index = function (t) return t.___ end}
function setDefault (t,d)t.___ = dsetmetatable(t,mt)
end
e.g.
local key = {} --以一个table作为key
local mt = {__index = function (t) return t[key] end}
function setDefault (t,d)t[key] = dsetmetatable(t,mt)
end
t = {} --original table
--keep a private access to the original table
local _t = t
--create proxy 代理
t = {}
--create metatable
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 --update original tableend
}
setmetatable(t,mt)t[2] = "hello"
print(t[2])
*update of element 2 to hello
*access to element 2
hello
e.g.
--read only table
function readOnly (t)local proxy = {}local mt = {__index = t,__newindex = function (t,k,v)error("attempt to update a read-only table",2) --在试图改变元素的时候抛出错误,且参数为2,表示在报错的地方将会是调用该方法的地方。end}setmetatable(proxy,mt)return proxy
end
通过在__newindex元方法里面做恰当的修改,便能将我们的table改写为只读table。
《Programming in Lua 3》读书笔记(十)相关推荐
- OREILLY Programming .NET 3.5 读书笔记之一
OREILLY Programming .NET 3.5 读书笔记之一 <Programming .NET 3.5>是OREILLY 2008.08出版的.NET 3.5 开发书籍,作者是 ...
- 主成分分析碎石图_ISLR读书笔记十九:主成分分析(PCA)
本文使用 Zhihu On VSCode 创作并发布 前面写的一些统计学习方法都是属于监督学习(supervised learning),这篇主成分分析(principal components an ...
- 计算机英语读书笔记,大学英文读书笔记范文英语读书笔记十篇带翻译.doc
大学英文读书笔记范文英语读书笔记十篇带翻译 My Room This is my room. Near the window there is a desk. I often do my homewo ...
- 图解HTTP读书笔记(十)
图解HTTP读书笔记(十) Web的攻击技术 HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用资源才是攻击目标. ...
- 《Programming in Scala》读书笔记(持续更新) - passover的个人空间 - DOIT博客 - 多易网...
<Programming in Scala>读书笔记(持续更新) - passover的个人空间 - DOIT博客 - 多易网 <Programming in Scala>读书 ...
- PHP第十次实验总结,The Clean Architecture in PHP 读书笔记(十)
laravel 这是clean architecture的第十篇,也是具体案例的第二篇,本篇会通过使用laravel框架,来开发我们的应用. 本文为系列文章的第十篇,完成的目录请查看Clean Arc ...
- 《联邦学习实战》杨强 读书笔记十四——构建公平的大数据交易市场
当数据具有资产属性之后,数据便可以直接或者间接地为公司.为社会创造价值和收益,并且可以作为一种特殊的商品在市场中进行交易. 与传统的商品交易相比,数据资产交易的市场前景更广阔,但同时也面临着很多的挑战 ...
- 《Programming in Lua 3》读书笔记(十二)
日期:2014.7.14 PartⅡ Object-Oriented Programming Lua中实现面向对象编程. "如同OOP对象,table拥有状态:如同OOP对象,table拥有 ...
- 《把时间当作朋友》读书笔记(十四)--积累(二)
节省与否 有些钱真不能省,否则注定"屌丝"一生,因为这种"节省"可能会伴随有很高的隐性成本,或者将来造成很大的负担----今天看来省了,可将来却要因此付出极大的 ...
最新文章
- 京东Vue组件库NutUI 2.0发布:将支持跨平台!
- Robots.txt和Robots META
- python 自学需要多久-怎么自学python,大概要多久?
- java 同步锁_java线程中的同步锁和互斥锁有什么区别?
- 前端学习(806):数据类型内存分配
- PyTorch 1.0 中文官方教程:使用 PyTorch C++ 前端
- python拦截tcp数据包_发送低级原始tcp数据包python
- Mysql 日志管理详解
- 使用fastjson读取超巨json文件引起的GC问题
- php 构造函数参数传值,php 构造函数参数
- 怎么隐藏电脑桌面计算机,怎么隐藏电脑桌面软件
- ubuntu20.04离线安装rabbitvcs
- oracle pdb启动日志,案例:Oracle 12C 数据库pdb丢失数据文件后的完整恢复过程
- win10证书服务器不可用怎么办,四种方法解决Win10专业版RPC服务器不可用的问题...
- 光缆定位仪光衰点定位光纤识别方法
- [BZOJ]4453: cys就是要拿英魂!
- java和大数据开发该选择哪个好就业?
- H5+Android混合开发电视APP
- 【Jsoup】 基本使用
- java中几种常用的对象类型(po,vo,bo,dto)
热门文章
- 如何将音乐添加到PowerPoint演示文稿
- 【C语言】#文件操作#有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。
- 有功功率、无功功率 和 视在功率之间的关联
- SQL SERVER(32)Transact-SQL概述
- 厦门大学计算机学院李平,学术盛会,知行合一 ——2020年厦门大学信息学院计算机科学系研究生学术论坛圆满举办...
- 对算法的时间复杂度的理解
- svg上传服务器无法显示,让WordPress支持上传SVG格式图片并显示在媒体库中的方法...
- 最近有朋友问我,如何在自媒体上快速发文章?
- PS初学者的一些实用技巧
- APP切换到后台时的运行规则以及如何实现后台运行