自从在公司和Lua第一次相遇之后,我的IT生涯从此也开启了另一个新篇。。。

起初并没有和Lua产生相遇时的那种电石火花般的怦然心动。。。但。。。

说实话虽然我的心没有因此触动但至少也不排斥。。。因为公司的需要,我就

必须去爱上她,所以大家都懂得。。。我们开始了正式的"交往"咯^_^ ^_^ ^_^

  在与Lua"交往"的这段时光里,你会发现自己已经渐渐的被Lua所吸引。。。

她虽然没有令你一见钟情的"容貌",但却有着你喜欢的那种日久生情的"气质"。。。

  废话就不多说了、、、咱直接进入主题吧。。。细说Metatable(元表)的那点事。。。

如果你想对lua中table的结构进行变化。。。那么就用lua的元表就来帮你实现。。。请看下面详解。。。

==>这次的博文新增了导航栏,,,方便博友们上下滚动网页来回切换视角、也别忽视了右侧的浮动目录。。。

  • 目录

    • __index元方法
    • __newindex元方法
    • __add元方法
    • __sub元方法
    • __call元方法
    • __tostirng元方法
目 录

一、 __index元方法

__index元方法:用于查看表中元素是否存在,如果不存在返回结果为nil;如果存在,则由__index返回结果

  存在__index元方法:

myTable = setmetatable({key1 = "lua", key3 = "java"}, {__index = function(myTable, key)if key == "key2" thenreturn "key2 is nil"elsereturn myTable[key]endend
})

  程序运行输出:

---------- 新建程序 ----------
lua    key2 is nil    java输出完成 (耗时 0 秒) - 正常终止

  不存在__index元方法:

myTable = {key1 = "lua", key3 = "java"}print(myTable.key1, myTable.key2, myTable.key3)

  程序运行输出:

---------- 新建程序 ----------
lua    nil    java输出完成 (耗时 0 秒) - 正常终止

二、__newindex元方法

__newindex元方法:用来对表进行更新。给一个表的缺少的索引赋值时,解释器就会查找是否存在__newindex元方法,

          如果存在则调用这个函数而不进行赋值操作;不存在则进行赋值操作。(只针对表中不存在的索引有效)

  存在__newindex元方法:

myTable = {key1 = "lua", key3 = "java"}setmetatable(myTable, {__newindex = function(myTable, key, value)print(key .. " is not exists in myTable " .. value)end
})myTable.key1 = "hello"
myTable.key2 = "world"    --给key2赋值会执行__newindex函数print(myTable.key1, myTable.key2)

  程序运行输出:

---------- 新建程序 ----------
key2 is not exists in myTable world
hello    nil输出完成 (耗时 0 秒) - 正常终止

  解释说明:  在给myTable表的key1索引赋值时,因为key1索引是myTable中已经存在的索引,

       所以只进行赋值而不调用__newindex元方法;

         在给myTable表的key2索引赋值时,因为key2索引在myTable表中不存在,解释器就会查找

       是否存在__newindex元方法,又由于存在__newindex元方法,所以调用了__newindex元方法

       而不对key2索引进行赋值;若不存在__newindex方法,则对新索引进行赋值操作。 

  不存在__newindex元方法:

myTable = {key1 = "lua", key3 = "java"}myTable.key1 = "hello"
myTable.key2 = "world"    print(myTable.key1, myTable.key2)

  程序运行输出:

---------- 新建程序 ----------
hello    world输出完成 (耗时 0 秒) - 正常终止

三、__add元方法

__add元方法:用于操作表与表之间的关联事件。当两张表之间用到字符'+'时,解释器就会去查找是否存在__add元方法,

        若存在__add元方法,则调用__add元方法,否则程序执行报错。(对应的运算符:'+')

  存在__add元方法:

myTable = {10, 20, 30}
newTable = {20, 30, 40}setmetatable(myTable, {__add = function(myTable, newTable)print("add")    --此处用来处理相关事件,可遍历两个对其中的元素进行累加求和并返回return "already add"end
})print(myTable + newTable)

  程序运行输出:

---------- 新建程序 ----------
add
already add输出完成 (耗时 0 秒) - 正常终止

四、__sub元方法

__sub元方法:用法类似于__add元方法。(对应的运算符:'-')

myTable = {10, 20, 30}
newTable = {20, 30, 40}setmetatable(myTable, {  __sub = function(myTable, newTable)  --__sub可替换__mul/__div/__mod/__unm/__concat/__eq/__lt/__leprint("subtract")    --处理相关事件return "already subtract"end
})print(myTable - newTable)  --此处要替换为相应的对应运算符

  程序运行输出:

---------- 新建程序 ----------
subtract
already subtract输出完成 (耗时 0 秒) - 正常终止

类似于__add和__sub元方法的还有:

  __mul元方法:对应运算符'*'

  __div元方法:对应运算符'/'

  __mod元方法:对应运算符'%'

  __pow元方法:对应运算符'^'

  __unm元方法:对应运算符'-',此处的运算符不是减号,是代表负数

  __concat元方法:对应运算符'..'

  __eq元方法:对应运算符'=='

  __lt元方法:对应运算符'<'

  __le元方法:对应运算符'<='

最后再拿__unm元方法举例:

myTable = {10, 20, 30}setmetatable(myTable, {__unm = function(myTable)print("nagative")    --处理相关事件return "already nagative"end
})print(-myTable)

  程序运行输出:

---------- 新建程序 ----------
nagative
already nagative输出完成 (耗时 0 秒) - 正常终止

五、__call元方法

__call元方法:用于表变量调用一个参数时调用__call元方法。

myTable = {10, 20, 30}
num = 100setmetatable(myTable, {__call = function(myTable, param)    --此处的param可替换其他类型的变量print("call " .. param)    --处理相关事件return "already call"end
})print(myTable(num))  --myTable调用num变量

  程序运行输出:

---------- 新建程序 ----------
call 100
already call输出完成 (耗时 0 秒) - 正常终止

六、__tostring元方法

__tostring元方法:用于修改表的输出行为。【类似于JAVA中类中重写了toString()方法,用于修改对象的输出行为】

--写法一
myTable = {10, 20, 30}setmetatable(myTable, {__tostring = function(myTable)    --注意__tostring是两个_开头local sum = 0for _,v in pairs(myTable) do  --注意此处的_字符也表示变量,可用字母k或其他字母替代sum = sum + vendreturn ("表元素之和=" .. sum)end
})print(myTable)

--写法二
myTable = {10, 20, 30}mt = {}mt.__tostring = function(myTable)local sum = 0for _,v in pairs(myTable) dosum = sum + vendreturn ("表元素之和=" .. sum)
endsetmetatable(myTable, mt)print(myTable)

  循环遍历部分也可修改为:

for index = 1,#myTable dosum = sum + myTable[index]
end

  程序运行输出:

---------- 新建程序 ----------
表元素之和=60输出完成 (耗时 0 秒) - 正常终止

  

  明天就要去出差了、、、在这之前。。把我和Lua的相知篇赶出来和大家分享。。。

希望多少能够给大家带来一点帮助。。。

  如果博友们看出了我在认知Lua的过程中,,,对Lua有误解。。。说出来、、、

我们一起探讨探!!!  *^_^*

  如果觉得此博文写的还行、看着还不错的博友们。。。移动起你们的鼠标。。。轻轻一点推荐

把祝福传给我们。。。让知识传递下去。。。 *^_^* *^_^* *^_^*

  有想关注和阅读我最新博文的博友们。。。就关注走一波咯。。。

   

       喜欢和爱是有差别的。。。

     喜欢是让自己高兴,,,爱却是让对方幸福。。。

    喜欢是一种占有,,,爱更多的是一种付出,一种责任。。。

  想要看起来毫不费力,,,在这之前你就必须全力以赴。。。

转载于:https://www.cnblogs.com/JimLy-BUG/p/5364281.html

Metatable让我从心认知了Lua(相知篇)相关推荐

  1. 小鹏汽车高管个人年薪超4亿?网友:超过我对金钱的认知了

    近日,国内财经媒体@钛媒体发布了高管薪酬排行TOP20榜单及高管个人年薪TOP50榜单,其中高管年薪排名第二的是小鹏汽车,已披露的8个董事合计年薪为4.4亿元,个人年薪排名第一的是小鹏汽车总裁顾宏地, ...

  2. 颠覆认知了,公司 SRE 天天到底在干嘛?不会是重启工程师吧?

    欢迎关注方志朋的博客,回复"666"获面试宝典 有很多人问过我想了解一下 SRE 这个岗位,这是个很大的话题,在这篇文章中把想到的一些介绍一下吧. SRE 到底是什么?这是一个最早 ...

  3. 特斯拉CEO对自动驾驶发表预测,专家:别扰乱公众的认知了

    https://www.toutiao.com/a6684401073920147982/ 2019-04-27 10:50:04 这两天,美国电动汽车公司特斯拉的首席执行官埃隆·马斯克,就特斯拉汽车 ...

  4. Lua基础篇-1 :什么是 Lua 语言?

    2019独角兽企业重金招聘Python工程师标准>>> 1:Lua语言简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从 ...

  5. Lua学习篇③——数据类型

    学过C\C++.C#等主流编程语言的人都清楚,这些语言中对数据类型都有明确的定义,整型必须定义为int.字符串必须定义为string等.而Lua对变量类型的定义是动态的,也就是说对于一个变量,我们不需 ...

  6. 节后收心困难?这15篇论文,让你迅速找回学习状态

    在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果. 点击本文底部的「阅读原文」即刻加入社区 ...

  7. Springboot整合RabbitMq-用心看完这一篇就够了(最新)

    SpringBoot-整合MQ---目录 第一步创建一个springboot的项目 1---HelloWorld模型 2---Work模型 3---Fanout模式 4---direct路由模式 5- ...

  8. 图标绘制入门1:简单介绍及图标设计规范

    在开发过程中,难免少不了各种图标,赏心悦目的UI界面需要优秀的图标设计.不过老是找设计师画图也不好,一次两次可以,次数多了人也是会烦的.所以自力更生吧,做一个全能全栈的程序员. 选择图标绘制软件 在u ...

  9. Lua语言模型 与 Redis应用

    Lua语言模型 与 Redis应用 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis. 本篇博客主要介绍了 Lua 语言不一样的设计 ...

  10. Go语言和php个和lua,当 Go 遇上了 Lua

    在 GitHub 玩耍时,偶然发现了 gopher-lua ,这是一个纯 Golang 实现的 Lua 虚拟机.我们知道 Golang 是静态语言,而 Lua 是动态语言,Golang 的性能和效率各 ...

最新文章

  1. 胡总和老朱说的一个小技巧
  2. PacBio三代测序
  3. 怎么将一个十进制数转化为二进制数并打印出来
  4. C++counting sort计数排序的实现算法(附完整源码)
  5. Coolite TextField添加回车事件
  6. 英特网rst服务器未在运行,技术员示范win7系统提示“英特尔(R)RST服务未在运行”的详细办法...
  7. Java命令:jstack — 获取线程dump信息
  8. HTML5清除2个div标签的空白,DIV标签里面IMG图片下方留有空白怎么办
  9. Android 高仿QQ5.2双向側滑菜单DrawerLayout实现源代码
  10. 拓端tecdat|R语言使用Profviz进行Metropolis-in-Gibbs抽样和运行时间分析
  11. 大智慧交易系统测试软件,大智慧交易系统测试平台使用操作教程
  12. 【C 语言提高、进阶】Day 3
  13. Navicat Premium 用于增强您的数据库管理系统
  14. [疯狂Java]JDBC:事务管理、中间点、批量更新
  15. 腾讯 Code Review 规范出炉!
  16. 一款轻、快、无广告的杀毒安全软件(火绒5.0)
  17. JS toFixed(2) 返回 -0.00
  18. Linux计划任务篇
  19. 全网17个在线平面设计网站评测(基础体验)
  20. 本地生活服务商家小程序开发解决方案

热门文章

  1. usmssosetup 单点登录被禁用_单点登录系统,如果cookie被禁用了怎么办
  2. python编程设计圆柱_《学习PYTHON—做个有编程能力的设计师》怎么样_目录_pdf在线阅读 - 课课家教育...
  3. 【算法笔记+HDU2222】AC自动机(统计一个长字符串由多少个不同的短字符串组成)
  4. hdoj1176:免费馅饼(dp基础题-数塔思想)
  5. python的评分卡模型
  6. $2a开头的是什么加密方式_为什么非对称加密比对称加密慢?
  7. [codeup 1128]出租车费
  8. java对象调用方法,java 对象调用
  9. python最常用的版本是_在下列选项中,( ) 是最常用的 Python版本,也称之为CIassicPython。_学小易找答案...
  10. micropython支持stm32型号_轻松几步实现在STM32上运行FreeRTOS任务