【Lua进阶系列】之Lua元方法案例+字段

    大家好,我是Lampard~~

    欢迎来到Lua进阶系列的博客

前文再续,书接上一回。今天和大家讲解一下lua中的元方法

    

  __index字段

   说起lua那么就不得不提其元表,lua通过元表的设置实现了高级语言中的“继承”的功能。

   关于lua面向对象以及元表内容可以参考这篇博客

当我们访问一个表中不存在的元素时,会执行以下三个步骤:

   1.lua会判断这个表是否有元表,若无则返回nil 

   

   2.若存在着元表,则会判断元表是否存在__index字段,若无则返回nil

 (这样子是取不到c的值的)

   3.若元表中存在着__index字段,若__index对应的值是一个函数则得到函数的返回值

 

 若对应的是一个表则在该表中寻找想要的值,若有则返回,若无则重复123

__newindex

 如果说__index字段是在访问表中不存在的值是执行的操作的话

 那么__nexindex字段则是在对表中不存在的值进行赋值时候执行的操作(记住i是小写)

 在这个时候可能有人吐槽:纳尼!!我天天给表创建新字段,咋不见得有执行什么__newindex呢?

 确实,如果没有元表,或者元表中没有__newindex字段则就是普通新建一个字段而已

 

若存在元表且元表中存在着__newindex字段,且__nexindex字段是一个函数,则会执行这个函数

若__nexindex字段是表会怎么样呢?

我们可以看到,当我们输出myTable.c时,lua是找不到这个值的,也就是说虽然yourTable中存在着c的值,但是它不能像__index字段那样,把这个值当做myTable的值输出。好玩的来了,我们不是对myTable.c赋值过了吗?那为什么还是nil呢?从结果我们可以看到,其实这个3我们是赋值给了yourTable.c, 总结来说,就是当__nexindex字段是表的时候,它会吃掉外表的新字段赋值,但是却不能从外表中访问得到。

那么这个__newindex字段有何作用呢?其实它可以起到一个很好的限制筛选作用。可以防止表被赋值,加入些杂七杂八的元素。有时候一表多用可能会导致些lua中的垃圾回收相关的问题。

__call

__call元方法比较好玩,比如说我们上述例子中的myTable是外部引用的一个表。那如果我把它当成一个函数使用会怎么样呢?

print(myTable(1, 2))

毫无疑问是会报错的哈,但是__call方法能够帮助我们实现解决这个问题

比如说我们的myTable和yourTable都是一个序列(num类型的),我想求出这两个序列的总和

这个时候可能有同学会问:搞那么复杂干嘛咧,我们直接先遍历一遍myTable,再遍历一遍yourTable不就好了吗?或者说我直接在myTable中添加一个新的函数字段,实现同样的功能不也一样吗?

诚然功能确实是一样的,但是如果我们需要频繁的利用这个外表(myTable)去生成或取得某一些内容时,利用__call方法会简便许多你说是myTable(XX)方便还是myTable.函数名(XX)方便?

__tostring

__tostring 元方法用于修改表的输出行为 ,如果我们直接print()一个表,那么我们返回得到的是一个地址。

而如果我们通过设置其元表的__tostring字段,那么返回的就是你想要的结果。

比如上面的例子就是输出自己的序列和,记住__tostring返回的是一个字符串,不然会报错。

眼尖的同学可能立刻就发现了,阿西,你这里的sum不就是一个num吗?

但是lua在print一个num的时候会自动把它转化为string类型, 但是不是所有的类型都会自动转换的

__le,__eq,  __lt,__add, __pow,__mod

 这三个元方法分别对应:小于等于,等于,小于,加法,乘幂,取模等

当我们对两个表进行大小比较,或者加减乘除乘幂取模的时候。

lua会查看元表中是否有对应的字段,若有则执行相关的函数,没有则会报错。

好,今天的分享就到这里,祝各位功力渐长平步青云,谢谢大家~~

【Lua进阶系列】lua元方法相关推荐

  1. 【Lua进阶系列】实例lua调用capi

                             [Lua进阶系列]实例lua调用capi     大家好,我是Lampard~~     欢迎来到Lua进阶系列的博客     首先祝大家2021新年 ...

  2. 【Lua进阶系列】lua_Stack

                              [Lua进阶系列]lua_Stack     大家好,我是Lampard~~     欢迎来到Lua进阶系列的博客 前文再续,书接上一回.今天和大家 ...

  3. Lua中强大的元方法__index详解

    今天要来介绍比较好玩的内容--__index元方法 1.我是备胎,记得回头看看 咳咳,相信每一位女生都拥有或者不知不觉中拥有了一些备胎,啊,当然,又或许是成为过别人的备胎. 没有备胎的人,就不是完整的 ...

  4. Lua 元表及常见元方法

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

  5. Lua 学习元表,元方法

    前言 Lua本身没有面向对象的思想,但是可以根据表.元表.元方法来靠近它 一.元表与元方法的概念 Lua中每个值都可具有元表.元表是普通的Lua表,定义了原始值在某些特定操作下 的行为.例如,当tab ...

  6. [Lua语言编程]Lua语言基础知识

    文章目录 `Lua` `Lua`语言的起源 `Lua` 特性 `Lua下载` Linux 系统上安装 Mac OS X 系统上安装 Window 系统上安装 `Lua` `Lua`语言语法 `Lua` ...

  7. 【Lua基础系列】rawset rawget方法

                  [Lua基础系列]rawset & rawget方法     大家好,我是Lampard~~     欢迎来到Lua基础系列的博客 前文再续,书接上一回.今天和大家 ...

  8. lua学习笔记之元表和元方法

    元表允许当遇到未知操作时,改变值的行为.例如,使用元表,可以定义表a与表b的关系运算a+b.当lua尝试两个表相加时,会检查是否其中一个有元表并且元表是否有__add字段. 元表在面向对象的术语中是一 ...

  9. lua元表和元方法 《lua程序设计》 13章 读书笔记

    lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在创建table时不会创建元表. t = {} print(getmet ...

最新文章

  1. python pycharm 包 安装问题
  2. 深入理解Java的接口和抽象类
  3. 一些真诚的学习经验和生活感悟
  4. 【第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛】Simone and Graph Coloring
  5. php程序中报date错误
  6. MySQL里面json_MySQL中的JSON
  7. 朱邦芬院士:我所熟悉的几位中国物理学大师的为人之本
  8. php 获取当前页面url_PHP获取URL –如何获取当前页面的完整URL
  9. python读取大文件的某行_python 大文件以行为单位读取方式比对
  10. kali系统支持那些手机_将kali安装到手机上作为便携式系统启动盘的方法
  11. 【渝粤教育】电大中专品牌管理与推广 (3)作业 题库
  12. 在Windows上删除所有的Oracle安装 和电脑名改变后的设置...
  13. spring-第五篇之spring容器中的bean
  14. H5调用app原生接口
  15. 数字PCR的特点、优势和局限性浅析
  16. ExtJS4 时间在edge中显示为0NaN-NaN-NaN NaN:NaN
  17. android 个人云存储,个人云储存appv1.3
  18. HTML 中的各种标记简介
  19. android alarmmanager 收不到广播,关于安卓AlarmManager定时会失效的问题,请指点
  20. 话题情感混合模型(JST)

热门文章

  1. 围棋博弈程序的实现与思考(5)——提子算法
  2. Python去极值方法
  3. c# aspx转为html,asp.net(c#)网页跳转七种方法小结
  4. Win32.Rootkit.Lapka.Wozw 木马病毒分析
  5. 阿里沈询直播 分布式事务一
  6. 标准时间GMT|UTC以及NTP协议学习
  7. 晶闸管(可控硅)参数符号说明
  8. 北大-算法基础 烘晾衣服POJ3104
  9. 流星汇聚:跨境电商几大主流电商平台势均力敌,卖家如何选择?
  10. 设计一个动物声音模拟器,可以模拟许多动物的声音