Lua元表(__index方法个人理解)
什么是Lua元表:
原表可理解为“一个方法表(类似函数表)“,里面包含了一些解决方案。当一个table设置元表之后,相当于关联了这个方法表
- setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。
- getmetatable(table): 返回对象的元表(metatable)。
实例:
mytable = {} ; -- 普通表
mymetatable = {} ; -- 元表
setmetatable(mytable,mymetatable); -- 把 mymetatable 设为 mytable 的元表
以下为返回对象元表:
getmetatable(mytable) -- 这回返回mymetatable
元表中有很多原方法,下面以__index元方法为例:
当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
例如:
house = {house_computer = "Macbook"};
company = {company_computer = "Acer"};
setmetatable(house, company); --把company设置为house的metatable
print(house.company_computer);
输出的结果是nil。
把代码改为:
house = {house_computer = "Macbook"};
company = {company_computer = "Acer"};
company.__index = company; -- 把company的__index方法指向自己
setmetatable(house, company); --把company设置为house的metatable
print(house.company_computer);
输出的结果是Acer。
在刚学习时,对__index方法有所误解:如果house 的元表是company ,如果访问了一个house中不存在的成员,就会访问查找company中有没有这个成员。而这个理解实际上是错误的,即使将house的元表设置为company,而且company中也确实有这个成员,返回结果仍然会是nil,原因就是company的__index元方法没有赋值。之前有说过,原表类似于“方法表”,设置元表相当于关联了方法表,但是并不是在方法表里查找元素,而应该是调用方法表里相应的方法。__index就是定义了当表在查找相应的key值对应的value时,查找失败,应该怎么办。
把代码改为:
house = {house_computer = "Macbook"};
company = {company_computer = "Acer"};
company.__index = function()return "hello world!";end
setmetatable(house, company); --把company设置为house的metatable
print(house.company_computer);
输出的结果是hello world!。
在上述例子中,访问house.company_computer时,house中没有company_computer这个成员,但Lua接着发现house有元表company,注意:此时,Lua并不是直接在company中找名为company_computer的成员,而是调用company的__index方法,如果__index方法为nil,则返回nil,如果是一个表,那么就到__index方法所指的这个表中查找名为company_computer的成员,于是,最终找到了company_computer成员。__index方法除了可以是一个表,还可以是一个函数,如果是一个函数,__index方法被调用时将返回该函数的返回值。
总结
Lua 查找一个表元素时的规则,其实就是如下 3 个步骤:
- 1.在表中查找,如果找到,返回该元素,找不到则继续
- 2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
- 3.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复 1、2、3;如果 __index 方法是一个函数,则返回该函数的返回值。
该部分内容来自作者寰子:https://blog.csdn.net/xocoder/article/details/9028347
注:别的元方法也一样,调用的是实际上是设置的元表的元方法。
Lua元表(__index方法个人理解)相关推荐
- lua 元表/元方法
在lua中,每个值都有其对应的操作,比如数值型有加减乘除等操作,字符串型有连接截取等操作,那么这些操作(加减乘除,连接截取等)定义在什么地方呢?定义在这些值默认的元表中,如果想修改这些操作(比如加法) ...
- Lua 元表及常见元方法
一.什么是元表 Lua 中的 table 使用起来有点像c++中的 map 或者 unordered_map ,都是通过对应的key 获取对应的value.如果访问了表中不存在的key时,就会触发Lu ...
- Lua元表(Metatable)简易教程
文章目录 0.友情链接 1.引言 2.创建一个元表 2.1.__tostring方法 2.2.__add和__mul方法 2.3.__index方法 2.4.__call方法 3.完整代码 0.友情链 ...
- lua元表的相关知识
setmetatable()和getmetatable(): local a=8 local b = "s" local t = {1,2}--在Lua代码中,只能设置table的 ...
- 【转】五、谈扩展方法的理解
[转]五.谈扩展方法的理解 为什么要用扩展方法 在说什么是扩展方法之前我们先来说说为什么要用扩展方法. 首先我们定义一个 Person 类: public class Person {/// < ...
- python threading模块的方法_Python THREADING模块中的JOIN()方法深入理解
看了oschina上的两个代码,受益匪浅.其中对join()方法不理解,看python官网文档的介绍: join([timeout]):等待直到进程结束.这将阻塞正在调用的线程,直到被调用join() ...
- sklearn中GBDT的一些参数、属性、方法的理解
文章目录 GBDT 分类器 引入 重要参数 loss learning_rate subsample n_estimators criterion max_depth min_samples_leaf ...
- 频域分析方法的理解(信号、频谱、能量谱、功率谱、倒频谱、小波分析)(终极教程)
信号频域分析方法的理解(频谱.能量谱.功率谱.倒频谱.小波分析) 参考文献,值得一读 https://blog.csdn.net/fengzhuqiaoqiu/article/details/1011 ...
- hashCode()、equals()以及compareTo()方法的理解
原文出自:http://blog.sina.com.cn/s/blog_50d936c40100nvzz.html hashCode().equals()以及compareTo()方法的理解 转载▼ ...
最新文章
- RedHat Linux乱码解决方案(转)
- 子网、超网和无类域间路由
- ajax div 赋值重新渲染_优化向:单页应用多路由预渲染指南
- Pythonic---------详细讲解
- 构建Docker镜像指南,含实战案例
- python二维数组初始化_如何在Python中初始化二维数组?
- java程序设计题库
- Photoshop 2020 for Mac(PS 2020)中英双版
- 21、2010年中兴面试题
- PMP扫盲篇2 | PMP报名、缴费、考试那些事儿~~
- IDEA 主题颜色设置
- php界面怎么美化,美化你的应用程序的外观界面
- 编程算法 - 赛马问题
- 2018第七届中国金融科技峰会
- android短信接收流程
- 漫画 |《程序员十二时辰》,居然是这样的!内容过于真实 ...
- \t\t开心学国学(转载)
- 线性代数几种特殊类型行列式_及其计算
- aix 下mysql库使用_AIX中常用的SMIT的使用
- 一、SpringMVC基础入门,创建一个HelloWorld程序