什么是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方法个人理解)相关推荐

  1. lua 元表/元方法

    在lua中,每个值都有其对应的操作,比如数值型有加减乘除等操作,字符串型有连接截取等操作,那么这些操作(加减乘除,连接截取等)定义在什么地方呢?定义在这些值默认的元表中,如果想修改这些操作(比如加法) ...

  2. Lua 元表及常见元方法

    一.什么是元表 Lua 中的 table 使用起来有点像c++中的 map 或者 unordered_map ,都是通过对应的key 获取对应的value.如果访问了表中不存在的key时,就会触发Lu ...

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

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

  4. lua元表的相关知识

    setmetatable()和getmetatable(): local a=8 local b = "s" local t = {1,2}--在Lua代码中,只能设置table的 ...

  5. 【转】五、谈扩展方法的理解

    [转]五.谈扩展方法的理解 为什么要用扩展方法 在说什么是扩展方法之前我们先来说说为什么要用扩展方法. 首先我们定义一个 Person 类: public class Person {/// < ...

  6. python threading模块的方法_Python THREADING模块中的JOIN()方法深入理解

    看了oschina上的两个代码,受益匪浅.其中对join()方法不理解,看python官网文档的介绍: join([timeout]):等待直到进程结束.这将阻塞正在调用的线程,直到被调用join() ...

  7. sklearn中GBDT的一些参数、属性、方法的理解

    文章目录 GBDT 分类器 引入 重要参数 loss learning_rate subsample n_estimators criterion max_depth min_samples_leaf ...

  8. 频域分析方法的理解(信号、频谱、能量谱、功率谱、倒频谱、小波分析)(终极教程)

    信号频域分析方法的理解(频谱.能量谱.功率谱.倒频谱.小波分析) 参考文献,值得一读 https://blog.csdn.net/fengzhuqiaoqiu/article/details/1011 ...

  9. hashCode()、equals()以及compareTo()方法的理解

    原文出自:http://blog.sina.com.cn/s/blog_50d936c40100nvzz.html hashCode().equals()以及compareTo()方法的理解 转载▼ ...

最新文章

  1. RedHat Linux乱码解决方案(转)
  2. 子网、超网和无类域间路由
  3. ajax div 赋值重新渲染_优化向:单页应用多路由预渲染指南
  4. Pythonic---------详细讲解
  5. 构建Docker镜像指南,含实战案例
  6. python二维数组初始化_如何在Python中初始化二维数组?
  7. java程序设计题库
  8. Photoshop 2020 for Mac(PS 2020)中英双版
  9. 21、2010年中兴面试题
  10. PMP扫盲篇2 | PMP报名、缴费、考试那些事儿~~
  11. IDEA 主题颜色设置
  12. php界面怎么美化,美化你的应用程序的外观界面
  13. 编程算法 - 赛马问题
  14. 2018第七届中国金融科技峰会
  15. android短信接收流程
  16. 漫画 |《程序员十二时辰》,居然是这样的!内容过于真实 ...
  17. \t\t开心学国学(转载)
  18. 线性代数几种特殊类型行列式_及其计算
  19. aix 下mysql库使用_AIX中常用的SMIT的使用
  20. 一、SpringMVC基础入门,创建一个HelloWorld程序

热门文章

  1. PHOTOSHOP基本概念00
  2. Oracle 随机函数详解(dbms_random)
  3. python爬取小说项目概述_Python实现的爬取小说爬虫功能示例
  4. 社会性动物 第五章:大众传播、宣传与说服
  5. 前后端项目如何实现完美的OSS文件上传
  6. Word里如何把正文改成脚注
  7. ShareSDK 集成
  8. MySQL 表关系及多表操作(联合查询、连接查询、子查询)
  9. 平均年薪65.8万!大厂疯狂扩招,拿下这个证书Java开发就能起飞!
  10. Cesium中通过Primitive显示大量的点以及点的运动