我正在阅读Lua 4.0手册,我遇到了这个"标签"事情,但我不知道它是指什么。
http://www.lua.org/manual/4.0/manual.html#3
这是它提到的部分,但我仍然不知道手册在说什么。
答案 0 :(得分:5)
TL; DR:标签是现代元表的先驱。现在,事件处理程序对使用普通的表操作直接存储在元表中,因为它是正常的table
,然后我们使用那些标记,正常但是唯一的数字和特殊的数据结构,这限制了我们可以设置的事件,并且具有不同的界面
标签的一个缺点是它们不能被垃圾收集,因为它们是正常数字,因此它们的关联数据也不能。
引用第3节和第34节的重要部分;类型和标签":
除了类型之外,所有值都有一个标记。
每种类型
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侧的特定类型标签。
table
和userdata
类型的所有值都有标签,但程序员会为每个值独立设置。
tag
返回标记,settag
为table
和userdata
设置标记,newtag
创建新标记。
查看4.8节"标记方法",我们知道这些唯一ID仅用于舒适地关联相同Lua类型的所有值(或table
s和{{1具有特殊行为的相同语义用户类型:
Lua提供了一种扩展其语义的强大机制,称为标记方法。标记方法是程序员定义的函数,在执行Lua程序期间在特定关键点调用,允许程序员在这些点更改标准的Lua行为。这些点中的每一个都称为事件。
根据事件中涉及的值的标记选择为任何特定事件调用的标记方法(参见第3节)。函数
userdata
更改与给定对(标记,事件)关联的标记方法。它的第一个参数是标记,第二个参数是事件名称(一个字符串;见下文),第三个参数是新方法(一个函数),或者是nil,用于恢复该对的默认行为。settagmethod
函数返回该对的上一个标记方法。伴随函数settagmethod
接收标记和事件名称,并返回与该对关联的当前方法。
归结为gettagmethod
和settagmethod
用于管理从tag + event到handler的映射,以及运行时使用它作为扩展点。
正如LHF在下面提到的那样,The evolution of Lua中还有大量额外的细节和历史,例如标签方法是如何从先前的"后退"的扩展机制演变而来的,它不支持不同的值组的不同行为,而是全局的。