什么是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. Java内存溢出的详细解决方案
  2. 算法-从先序遍历还原二叉树
  3. Centos7更新阿里yum源
  4. 被动模式下FTP不能建立数据会话问题
  5. oracle_sqlserver和mysql获取表外键的方法_mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结...
  6. C++远征之封装篇——常对象成员、常成员函数
  7. 云头条 |华为云发布全新Slogan;AWS推出DocumentDB;FRB信号刷屏
  8. c 获取mysql安装路径_linux查看mysql安装路径
  9. 【四】Java流程控制
  10. Oh Mathematic, Oh God,太美了
  11. 个人财务软件java_个人账务管理系统java
  12. SS导航菜单水平居中的多种方法
  13. linux图形显卡驱动r600,R600/R700八款显卡Mesa开源驱动性能简测
  14. java simon_Java Simon
  15. python窗口中导入图片_Python3 tkinter基础 Text image 文本框中插入图片
  16. 自恋的人脑袋有啥不一样?| 自恋型人格特质和前额脑结构
  17. [Java]Spring Ioc讲解,不怕你不懂
  18. 第三届全国中医药院校大学生程序设计竞赛(部分题解)更新中~
  19. 将本机文件复制到安装的虚拟机系统中的两种方法
  20. 2023年,web前端工程师20道Vue面试题及解析

热门文章

  1. Keras 找不到权重的梯度 WARNING:tensorflow:Gradients do not exist for variables when minimizing the loss
  2. 最牛元旦(新年)祝福短信 新年快乐
  3. 台式计算机经常使用的硬盘是什么尺寸,台式硬盘寿命以工作小时计算一般是多少?怎么保养?移动硬盘上文件长期放着不动会不会破损?...
  4. Java高级开发面试,java课程百度网盘
  5. 从IBM Rational Software Architect设计管理器生成基于图的文档
  6. 基于TIA博途的滑动平均值滤波算法SCL语言程序(V15)
  7. 服务器升级中个性签名修改不了,告诉你别太嚣张 小心我对你的爱找不到服务器 QQ个性签名...
  8. Oracle 多表查询与集合运算
  9. 游戏是人工智能研究的理想场景
  10. 论文笔记:Generative Semantic Manipulation with Mask-Contrasting GAN