lua metatable 和 _index 实验
lua metatable 和 _index
中文博客解释:
http://www.cnblogs.com/simonw/archive/2007/01/17/622032.html
metatable:http://www.lua.org/pil/13.html
表的通用方法中,有些缺失的, 使用metatable可以定义表的这些默认方法:
add, sub, mul, div, mod, pow, unm, concat, len, eq, lt, le, tostring, gc, index, newindex, call...
__index: http://www.lua.org/pil/13.4.1.html
当访问表中无此元素, 则查询metatable中是否有__index, 如果有则获取_index调用结果, 如果没有__index则返回nil
__newindex : http://www.lua.org/pil/13.4.2.html
当设置表中不存在的key时候, 触发调用metatable 的 __newindex, 如果没有__newindex则设置到目标表的属性上, 如果存在__newindex, 则执行它。
例子:
__index __newindex 对比:
local Bird = {CanFly = true}function Bird:New()local b = {}setmetatable(b, self)self.__index = self--self.__newindex = selfreturn b endlocal Ostrich = Bird:New() --Bird.CanFly is true, Ostrich.CanFly is true Ostrich.CanFly = false --Bird.CanFly is true, Ostrich.CanFly is falseprint("Ostrich.CanFly="..tostring(Ostrich.CanFly)) print("Bird.CanFly="..tostring(Bird.CanFly))
其他测试实验:
--定义2个表 a = {5, 6} b = {7, 8} --用c来做Metatable c = {} --重定义加法操作 c.__add = function(op1, op2)for _, item in ipairs(op2) dotable.insert(op1, item)endreturn op1 end --自定义方法 c.print = function()print("c print!"); end --将a的Metatable设置为c, 报错,print为nil NOK --[[ setmetatable(a, c) a.print() ]] --将a的Metatable设置为c, 调用c定义的内置函数 OK --d现在的样子是{5,6,7,8} --[[ setmetatable(a, c) d = a + b for _, item in ipairs(d) doprint(item) end ]] --将a的__index设置为c, 可以调用c定义的print OK --[[ setmetatable(a, {__index = c}) a.print() ]] --将a的metatable设置为c, 可以调用c定义的print OK --[[ c.__index = c setmetatable(a, c) a.print() --]] --将a的__index不能直接复制为c, 报错, NOK --[[ a.__index = c a.print() --]] --将a的__index设置为c, 报错a不能执行算出运算, NOK --[[ setmetatable(a, {__index = c}) d = a + b for _, item in ipairs(d) doprint(item) end ]] --将a的__add设置为c的__add, OK --[[ setmetatable(a, {__add=c.__add}) d = a + b for _, item in ipairs(d) doprint(item) end --]] -- 可以调用自定义方法, 和 内置方法 OK --[[ setmetatable(a, {__index = c, __add=c.__add}) a.print() d = a + b for _, item in ipairs(d) doprint(item) end --]]
lua metatable 和 _index 实验相关推荐
- c语言数据库的连接字符串函数,C语言strcat()函数:连接字符串
头文件:#include strcat() 函数用来连接字符串,其原型为: char *strcat(char *dest, const char *src); [参数]dest 为目的字符串指针,s ...
- lua面向对象封装及元表(metatable)性能测试
Lua本身是没有面向对象支持的,但面向对象编程在逻辑复杂的大型工程却很有用.于是很多人用Lua本身的数据结构table来模拟面向对象.最简单的一种方法是把对象的方法.成员都放到table中.如: -- ...
- Lua_第 12 章 Metatables and Metamethods
第 12 章 Metatables and Metamethods Lua中的 table 由于定义的行为,我们可以对 key-value 对执行加操作,访问 key 对 应的 value,遍历所有的 ...
- 使用mysql-proxy读写分离时的注意事项_mysql-proxy中Admin Plugin的使用以及读写分离的问题...
一年前听Hiro说过MySQL Proxy这个应用,直到现在才来了兴致鼓弄鼓弄,也是因为来到这边后,有生产环境一直在用mysql-proxy实现应用的读写分离,前辈搭好的架构现在好好学习下.也就是从昨 ...
- lua-C++ userdata使用
lua-C++ userdata使用 所负责的产品使用非常灵活,可设置的参数上千个,而且还支持用户用lua进行流程控制,所以开发中要用到很多lua.C++混合编程.之前对这些也还是一知半解,只会依葫芦 ...
- Lua 元表(Metatable)
在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作. 因此 Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关 ...
- lua的元表metatable及元方法
前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了"+"符号,就可以进行类的加法运算.在Lu ...
- Lua中的metatable
Lua中的metatable Lua 中每个 值value(或者对象)都可以有一个 metatable(在 Lua 5.0 只有table和 userdata能够存在 metatable).每个 ta ...
- Lua元表(Metatable)简易教程
文章目录 0.友情链接 1.引言 2.创建一个元表 2.1.__tostring方法 2.2.__add和__mul方法 2.3.__index方法 2.4.__call方法 3.完整代码 0.友情链 ...
最新文章
- Memcache的原理的详解
- Python读取.set文件和.locs文件
- python装饰器实例-python装饰器案例
- 前端学习(2932):vue中的v-show
- Windows 10半年成全球第二!中国悲剧了
- 工程师们在摔倒后如何不尴尬
- 年度电竞游戏旗舰红魔3S发布:性能王者2999元起!
- 【报告分享】人工智能在五大行业的成就与挑战-毕马威.pdf(附下载链接)
- HDU4628+状态压缩DP
- 【历史上的今天】8 月 17 日:Oracle 创始人出生;第一个 COBOL 程序成功跑通!...
- 音视频开发之旅(41)-天空盒
- SpringBoot整合ureport2
- EI/scopus推荐-智能交通与智慧城市会议
- 【C++】教大家在七夕new一个对象
- 网页全屏的代码实现要不要了解一下(最全)
- 随机森林 OOB理解
- 计算机保研QA——by chx
- 【图】图的一般表示法以及其他表示法转化为一般表示法
- Linux远程联机服务器SSH VNC XDMCP RDP
- 数字阅读市场陷入两强之争 掌阅能不能守住半壁江山?
热门文章
- python生成50个随机数_Python内置random模块生成随机数的方法
- esp8266 php 接口,ESP8266_SDK基础(5)智能插座_完整项目代码
- java圆饼图插件_饼图----插件
- 河北师范大学计算机专业保研率,河北省内13所高校2021届保研率一览
- 24点游戏java_24点游戏动态规划解法(java)
- mysql privileges_[转]mysql privileges
- matlab中antoine方程应用,Antoine方程 安托因方程
- TortoiseSVN设置比较工具为BeyondCompare
- java面试题八 传值传引用
- 运营私域流量转化没效果为什么?