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 = self
return b
end local Ostrich = Bird:New() --Bird.CanFly is true, Ostrich.CanFly is true
Ostrich.CanFly = false --Bird.CanFly is true, Ostrich.CanFly is false print("Ostrich.CanFly="..tostring(Ostrich.CanFly))
print("Bird.CanFly="..tostring(Bird.CanFly))
其他测试实验:
--定义2个表
a = {, }
b = {, }
--用c来做Metatable
c = {}
--重定义加法操作
c.__add = function(op1, op2)
for _, item in ipairs(op2) do
table.insert(op1, item)
end
return 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) do
print(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) do
print(item)
end
]]
--将a的__add设置为c的__add, OK
--[[
setmetatable(a, {__add=c.__add})
d = a + b
for _, item in ipairs(d) do
print(item)
end
--]]
-- 可以调用自定义方法, 和 内置方法 OK
--[[
setmetatable(a, {__index = c, __add=c.__add})
a.print()
d = a + b
for _, item in ipairs(d) do
print(item)
end
--]]
lua metatable 和 _index 实验的更多相关文章
- Lua metatable & metamethod
[Lua metatable & metamethod] Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接的,但是对于两个table类型,则不能直接进行“+”操 ...
- lua metatable(元表)
lua metatable (元表) 概述 普通 table 类型的表仅能够做一些单表操作, 无法进行一些特殊的以及两个表的操作, 比如 table1 + table2, print(table3) ...
- lua metatable和metamethod元表和元方法
Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时, ...
- lua面向对象封装及元表(metatable)性能测试
Lua本身是没有面向对象支持的,但面向对象编程在逻辑复杂的大型工程却很有用.于是很多人用Lua本身的数据结构table来模拟面向对象.最简单的一种方法是把对象的方法.成员都放到table中.如: -- ...
- lua表类型
Lua的表的定义: typedef struct Table { CommonHeader; lu_byte flags; lu_byte lsizenode; /* log2 of size of ...
- 基于Lua插件化的Pcap流量监听代理
1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的 ...
- elastic search使用总结
1. elasticsearch安装 官方下载地址:https://www.elastic.co/downloads/elasticsearch 解压文件 elasticsearch-2.4.0.zi ...
- lua-C++ userdata使用
lua-C++ userdata使用 所负责的产品使用非常灵活,可设置的参数上千个,而且还支持用户用lua进行流程控制,所以开发中要用到很多lua.C++混合编程.之前对这些也还是一知半解,只会依葫芦 ...
- ROS学习笔记1-引言
该学习笔记参考ROS官方wiki的内容,见:http://wiki.ros.org/ROS/Introduction 什么是ROSROS的全称是Robot Operating System,即机器人操 ...
随机推荐
- 用wget下载文件
wget使用文档:https://www.gnu.org/software/wget/manual/wget.html 最开始常用的比如: wget -O /e/movie.mp4 http://w ...
- twitter storm源码走读之7 -- trident topology可靠性分析
欢迎转载,转载请注明出处,徽沪一郎. 本文详细分析TridentTopology的可靠性实现, TridentTopology通过transactional spout与transactional s ...
- SQL查询(二)
常用查询技巧 1.获取数据的前3(n)行 ; 2.SQL语句中if语句 在SQL语句中没有直接的if语句,但是有两个函数:DECODE和CASE,他们能够实现if语句的功能 2.1)decode -- ...
- 02/07/2106 @ 6:28am (UTC)
<?php echo pow(2,32); 4294967296 http://www.unixtimestamp.com/index.php 4294967296 Is equivalent ...
- P2882 Face The Right Way - USACO07MAR
这道题没有一个比较详细的题解,我来提供一份. 首先我们可以知道,反转区间的顺序对结果没有影响,而且一个区间如果翻转两次以上是没有意义的,所以,问题就变成了求哪些区间需要反转. 我们枚举k.对于每一个k ...
- Listener-监听器+ServletContext+ApplicationContext
参考资料 ServletContext和ApplicationContext有什么区别 ServletContext:是web容器的东西, 一个webapp一个, 比session作用范围要大, 从中 ...
- Spring配置文件的读取
1.配置文件的命名 Spring框架中的默认配置文件,建议命名为applicationContext.xml * 编写配置文件,默认位置有两个 ①src目录.②WEB-INF目录 2.Spring 配 ...
- log4j常用配置以及日志文件保存位置
log4j.rootLogger=INFO,CONSOLE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender ...
- Python中dict的特点、更新dict、遍历dict
dict的第一个特点是查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样.而list的查找速度随着元素增加而逐渐下降. 不过dict的查找速度快不是没有代价的,dict的缺点是占用内 ...
- HBase学习笔记-基础(一)
HBase版本:0.97 1.Get Gets实在Scan的基础上实现的. 2.联合查询(Join) HBase是否支持联合是一个网上常问问题.简单来说 : 不支持.至少不像传统RDBMS那样支持. ...