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 实验相关推荐

  1. c语言数据库的连接字符串函数,C语言strcat()函数:连接字符串

    头文件:#include strcat() 函数用来连接字符串,其原型为: char *strcat(char *dest, const char *src); [参数]dest 为目的字符串指针,s ...

  2. lua面向对象封装及元表(metatable)性能测试

    Lua本身是没有面向对象支持的,但面向对象编程在逻辑复杂的大型工程却很有用.于是很多人用Lua本身的数据结构table来模拟面向对象.最简单的一种方法是把对象的方法.成员都放到table中.如: -- ...

  3. Lua_第 12 章 Metatables and Metamethods

    第 12 章 Metatables and Metamethods Lua中的 table 由于定义的行为,我们可以对 key-value 对执行加操作,访问 key 对 应的 value,遍历所有的 ...

  4. 使用mysql-proxy读写分离时的注意事项_mysql-proxy中Admin Plugin的使用以及读写分离的问题...

    一年前听Hiro说过MySQL Proxy这个应用,直到现在才来了兴致鼓弄鼓弄,也是因为来到这边后,有生产环境一直在用mysql-proxy实现应用的读写分离,前辈搭好的架构现在好好学习下.也就是从昨 ...

  5. lua-C++ userdata使用

    lua-C++ userdata使用 所负责的产品使用非常灵活,可设置的参数上千个,而且还支持用户用lua进行流程控制,所以开发中要用到很多lua.C++混合编程.之前对这些也还是一知半解,只会依葫芦 ...

  6. Lua 元表(Metatable)

    在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作. 因此 Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关 ...

  7. lua的元表metatable及元方法

    前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了"+"符号,就可以进行类的加法运算.在Lu ...

  8. Lua中的metatable

    Lua中的metatable Lua 中每个 值value(或者对象)都可以有一个 metatable(在 Lua 5.0 只有table和 userdata能够存在 metatable).每个 ta ...

  9. Lua元表(Metatable)简易教程

    文章目录 0.友情链接 1.引言 2.创建一个元表 2.1.__tostring方法 2.2.__add和__mul方法 2.3.__index方法 2.4.__call方法 3.完整代码 0.友情链 ...

最新文章

  1. Memcache的原理的详解
  2. Python读取.set文件和.locs文件
  3. python装饰器实例-python装饰器案例
  4. 前端学习(2932):vue中的v-show
  5. Windows 10半年成全球第二!中国悲剧了
  6. 工程师们在摔倒后如何不尴尬
  7. 年度电竞游戏旗舰红魔3S发布:性能王者2999元起!
  8. 【报告分享】人工智能在五大行业的成就与挑战-毕马威.pdf(附下载链接)
  9. HDU4628+状态压缩DP
  10. 【历史上的今天】8 月 17 日:Oracle 创始人出生;第一个 COBOL 程序成功跑通!...
  11. 音视频开发之旅(41)-天空盒
  12. SpringBoot整合ureport2
  13. EI/scopus推荐-智能交通与智慧城市会议
  14. 【C++】教大家在七夕new一个对象
  15. 网页全屏的代码实现要不要了解一下(最全)
  16. 随机森林 OOB理解
  17. 计算机保研QA——by chx
  18. 【图】图的一般表示法以及其他表示法转化为一般表示法
  19. Linux远程联机服务器SSH VNC XDMCP RDP
  20. 数字阅读市场陷入两强之争 掌阅能不能守住半壁江山?

热门文章

  1. python生成50个随机数_Python内置random模块生成随机数的方法
  2. esp8266 php 接口,ESP8266_SDK基础(5)智能插座_完整项目代码
  3. java圆饼图插件_饼图----插件
  4. 河北师范大学计算机专业保研率,河北省内13所高校2021届保研率一览
  5. 24点游戏java_24点游戏动态规划解法(java)
  6. mysql privileges_[转]mysql privileges
  7. matlab中antoine方程应用,Antoine方程 安托因方程
  8. TortoiseSVN设置比较工具为BeyondCompare
  9. java面试题八 传值传引用
  10. 运营私域流量转化没效果为什么?