Lua 4.0中的"标签"是什么?

Ver*_*Quo 4 lua lua-4.0

我正在阅读Lua 4.0手册,我遇到了这个"标签"的东西,但我不知道它指的是什么.

http://www.lua.org/manual/4.0/manual.html#3

这是它提到它的部分,但我仍然不知道手册正在谈论什么.

Ded*_*tor 6

TL; DR:标签是现代元表的先驱.现在,事件处理程序对使用普通的表操作直接存储在元表中,因为它是正常的table,然后我们使用那些标签,正常但是唯一的数字,以及特殊的数据结构,这限制了我们的事件可以设置,并有一个不同的界面.
标签的一个缺点是它们不能被垃圾收集,因为它们是正常数字,因此它们的相关数据也不能.


引用第3节"类型和标签"的重要部分:

除了类型,所有值都有一个标记.

每种类型的nil,number以及string具有不同的标签.每种类型的所有值都具有相同的预定义标记.如上所述,类型的值function可以具有两个不同的标签,这取决于它们是Lua函数还是C函数.最后,类型userdata和值的值table可以由程序员分配变量标签(参见第4.8节).该tag函数返回给定值的标记.用户标签是使用该功能创建的newtag.该settag函数用于更改表的标记(参见第6.1节).userdata值的标记只能从C设置(参见第5.7节).标签主要用于在发生某些事件时选择标签方法.标记方法是扩展Lua语义的主要机制(参见第4.8节).

因此,将标记视为唯一ID.
每个值都有一个标记,具体取决于其类型:

  • 类型的所有值nil,number,string,function(C-味),function(LUA味)具有特定类型的标签上的C侧设置.

  • 类型的所有值tableuserdata都有标签,但是程序员为每个值独立设置这些值.

tag返回的标签,settag将其设置为tableuserdata,newtag创建一个新的.

在查看4.8节"标记方法"时,我们了解到这些唯一ID仅用于将相同Lua类型(或同一语义用户类型的tables和userdatas)的所有值与特殊行为轻松关联:

Lua提供了一种强大的机制来扩展其语义,称为标记方法.标记方法是程序员定义的函数,在执行Lua程序期间在特定关键点调用,允许程序员在这些点更改标准的Lua行为.这些点中的每一个都称为事件.

根据事件中涉及的值的标记选择为任何特定事件调用的标记方法(参见第3节).该函数settagmethod更改与给定对(标记,事件)关联的标记方法.它的第一个参数是标记,第二个参数是事件名称(一个字符串;见下文),第三个参数是新方法(一个函数),或者是nil,用于恢复该对的默认行为.该settagmethod函数返回该对的前一个标记方法.伴随函数gettagmethod接收标记和事件名称,并返回与该对关联的当前方法.

这只是归结为settagmethodgettagmethod用于管理从tag + event到handler的映射,以及使用它作为扩展点的运行时.

正如LHF在下面提到的那样,在Lua的演变中有很多额外的细节和历史,例如标签方法是如何从之前的"后备"扩展机制演变而来的,后者不支持不同行为的不同行为,而是全球化.

  • 另见[Lua的演变](http://www.lua.org/doc/hopl.pdf),特别是第5.3和6.8节. (3认同)