计算中常说的元表是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算中常说的元表是啥?相关的知识,希望对你有一定的参考价值。

计算中常说的元表是什么?

元表就是一个lua表,程序开发中有元表,那个值都可以有一个元表。
1.Lua 中的每个值都可以有一个 元表。 这个 元表 就是一个普通的 Lua 表, 它用于定义原始值在特定操作下的行为。 如果你想改变一个值在特定操作下的行为,你可以在它的元表中设置对应域。 例如,当你对非数字制作加操作时, Lua 会检查该值的元表中的 "__add" 域下的函数。 如果能找到,Lua 则调用这个函数来完成加这个操作。
2.元表中的键对应着不同的 事件 名; 键关联的那些值被称为 元方法。 在上面那个例子中引用的事件为 "add" , 完成加操作的那个函数就是元方法。
你可以用 getmetatable 函数 来获取任何值的元表。
3.使用 setmetatable 来替换一张表的元表。在 Lua 中,你不可以改变表以外其它类型的值的元表 ; 若想改变这些非表类型的值的元表,请使用 C API。
表和完全用户数据有独立的元表 (当然,多个表和用户数据可以共享同一个元表)。 其它类型的值按类型共享元表; 也就是说所有的数字都共享同一个元表, 所有的字符串共享另一个元表等等。 默认情况下,值是没有元表的, 但字符串库在初始化的时候为字符串类型设置了元表 ()。
4.元表决定了一个对象在数学运算、位运算、比较、连接、 取长度、调用、索引时的行为。 元表还可以定义一个函数,当表对象或用户数据对象在垃圾回收 ()时调用它。
5.接下来会给出一张元表可以控制的事件的完整列表。 每个操作都用对应的事件名来区分。 每个事件的键名用加有 '__' 前缀的字符串来表示; 例如 "add" 操作的键名为字符串 "__add"。 注意、Lua 从元表中直接获取元方法; 访问元表中的元方法永远不会触发另一次元方法。 下面的代码模拟了 Lua 从一个对象 obj 中获取一个元方法的过程:
6.对于一元操作符(取负、求长度、位反), 元方法调用的时候,第二个参数是个哑元,其值等于第一个参数。 这样处理仅仅是为了简化 Lua 的内部实现 (这样处理可以让所有的操作都和二元操作一致), 这个行为有可能在将来的

7.元表中的键对应着不同的 事件 名; 键关联的那些值被称为 元方法。 在上面那个例子中引用的事件为 "add" , 完成加操作的那个函数就是元方法。
你可以用 getmetatable 函数 来获取任何值的元表。
8.使用 setmetatable 来替换一张表的元表。在 Lua 中,你不可以改变表以外其它类型的值的元表 ; 若想改变这些非表类型的值的元表,请使用 C API。
表和完全用户数据有独立的元表 (当然,多个表和用户数据可以共享同一个元表)。 其它类型的值按类型共享元表; 也就是说所有的数字都共享同一个元表, 所有的字符串共享另一个元表等等。 默认情况下,值是没有元表的, 但字符串库在初始化的时候为字符串类型设置了元表 ()。

参考技术A 通常,Lua中的每个值都有一套预定义操作集合,比如数字可以相加,字符串可以连接,表中可以插入键值对等;但是我们无法对两个table相加,无法对函数进行比较等;

元表的出现可以解决以上问题:我们可以通过元表来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作;

Lua中每个值都有一个元表,table和userdata可以有各自独立的元表,其它类型的值则共享其类型所属的单一元表;在Lua代码中,只能设置table的元表,其它类型的值的元表需要通过C代码来完成;

元表就是,如果一个tableB 调用setmetatable方法设置另外一个tableA作为它的元表,那么当你操作tableB进行一些操作如设置键值,查找键值,table间使用运算符号、或者直接传个参数调用等操作时,结果就会变得不一样或者原本不可行操作的现在可行了。而tableA之所以能作为元表,是因为里面包含了特殊的键(也就是元方法)代表着特殊的含义,代码在运行时会做特殊的处理。

元表的作用就在于它允许我们通过元表来改变表的行为;元方法类似于操作符重载;

以上是关于计算中常说的元表是啥?的主要内容,如果未能解决你的问题,请参考以下文章

元表是如何工作的,它们的用途是啥?

lua元表

Lua中的元表与元方法

Lua中的元表与元方法

10----元表

lua的元表有什么好玩的