当前位置: 首页 > 编程笔记 >

Lua中关于元方法的一些知识点小结

阳宗清
2023-03-14
本文向大家介绍Lua中关于元方法的一些知识点小结,包括了Lua中关于元方法的一些知识点小结的使用技巧和注意事项,需要的朋友参考一下

本篇要介绍的东西比较零散,都是一些小知识点,所以就放在一起了。

1.两个具有不同元表的值进行算术操作(比如加法)

之前举例的时候,两个table相加,这两个table都是具有相同的元表的,所以没有任何问题。
那么,如果两个table或者两个进行相加操作的值,具有不同的元表呢?

对于这种情况,Lua是这样处理:

a.如果第一个值有元表,就以这个元表为准
b.否则,如果第二个值有元表,就用第二个值的元表
c.如果两个值都没有元表,或者没有对于的元方法,那么,就会报错
 

2.关系类的元方法

除了加法减法这些算术类的操作之外,大于小于等这些关系类的操作也是有元方法的:
__eq:等于
__lt:小于
__le:小于等于
 
如果对两个具备不同元表的值进行这些比较操作,就会报错,一定要注意,这和加减法的规则不一样。
其实想想也很有道理,元表都不一样了,怎么去判断大小呢?判断大小是要有规则的。
 
比如,在军队里,中尉的职位肯定是小于上校的职位。
然后,到了外星世界呢(假设有外星人)?说不定中尉是大于上校的。
所以,地球人和外星人是不能用同一种方式进行军衔比较的。
 
当然,大家也许会说:那地球人和外星人也不能用同一种方式进行加法操作啊!
没错,但是,Lua就是这么规定的啊!你找作者去啊!关我什么事!
 
最后,比较特殊的,进行“等于”操作,是不会报错的,哪怕是具有不同元表的值进行等于操作。
其实这想想也是很有道理,地球人等于外星人吗?不等于。在外星那边,外星人也会得到一样的答案,即使判断标准不同。
(小若:Lua就是这么规定的,你还有道理个毛线啊!围绕着规则去说道理,很好玩吗?)
 

3.保护元表

我们都知道,通过setmetatable和getmetatable可以分别设置和获得元表。

但是,如果我们不希望元表被修改或者被看到呢?

比如某天你当了主程,你写了一个很牛的模块,因为某些原因要交给一个刚毕业不到30年的学生去修改。

(小若:毕业30年那还叫做学生吗?都快要退休了吧!)

你很肯定你的某个值的元表是不能被改动的,那,你就可以把它保护起来了。
 
我们可以给元表的__metatable字段赋值,比如:mt.__metatable = “你别碰它的元表,否则过了10年的试用期之后,你就等着走人吧!”

然后,如果那个毕业不到30年的学生真的不小心去修改你的元表的话:


print(getmetatable(s1));

setmetatable(s1, mt);


将会输出类似以下的日志:
你别碰它的元表,否则过了10年的试用期之后,你就等着走人吧!
cannot change protected metatable
 
好了,这样这个学生就肯定不改你的元表了,毕竟工作要紧。(小若:试用期10年,真是个好公司)
 

4.结束

本来还想接着写下一篇的,毕竟时间还早,但是下一篇要介绍__index和__newindex。
我感觉我会说的比较多,还是明晚再写吧。

 类似资料:
  • 本文向大家介绍关于SQL注入绕过的一些知识点,包括了关于SQL注入绕过的一些知识点的使用技巧和注意事项,需要的朋友参考一下 一、 绕过waf思路 从第一步起,一点一点去分析,然后绕过。 1、过滤 and,or 2、过滤 and, or, union 3、过滤 and, or, union, where 4、过滤 and, or, union, where, limit 5、过滤 and, or,

  • 本文向大家介绍Javascript中this关键字的一些小知识,包括了Javascript中this关键字的一些小知识的使用技巧和注意事项,需要的朋友参考一下 Javascript应该是现在最流行的跨平台语言之一,一直在玩前端的一些有意思的东西,发现竟然没有掌握好这门语言。有点舍本逐末,于是想趁着现在这有空的时候好好补充一点遗漏的东西。 this的隐性绑定 一开始这是我很迷惑的东西,刚开始看到的时

  • 一些关于精灵的其他知识 目前为止你已经学会了如何用相当多有用的精灵的属性,像x, y, visible, 和 rotation ,它们让你能够让你很大程度上控制精灵的位置和外观。但是Pixi精灵也有其他很多有用的属性可以使用。 这是一个完整的列表 Pixi的类继承体系是怎么工作的呢?(什么是 类 , 什么是 继承?点击这个链接了解.)Pixi的精灵遵循以下原型链构建了一个继承模型: Display

  • 隐藏盒子的几种方式 隐藏盒子,有以下几种方式: (1)方式一: overflow:hidden; //隐藏盒子超出的部分 (2)方式二: display: none; 隐藏盒子,而且不占位置(用的最多) 比如,点击X,关闭京东首页上方的广告栏。 (3)方式三: visibility: hidden; //隐藏盒子,占位置。 visibility: visible; //让盒子重新

  • 本文向大家介绍Lua中使用模块的一些基础知识,包括了Lua中使用模块的一些基础知识的使用技巧和注意事项,需要的朋友参考一下 --两个横线开始单行的注释,--[[加上两个[和]表示多行的注释--]]。

  • 本文向大家介绍Lua中的函数相关知识点整理汇总,包括了Lua中的函数相关知识点整理汇总的使用技巧和注意事项,需要的朋友参考一下  函数是一组一起执行任务的语句。可以把代码放到独立的函数中。怎么划分代码功能之间的不同,但在逻辑上划分通常是让每个函数执行特定的任务。 Lua语言提供了程序可以调用大量的内置方法。例如,方法print()打印作为输入传参数在控制台中。 函数是已知的各种名称,如方法或子程序