什么是"标签"在Lua 4.0?

时间:2015-01-15 09:24:37

标签: lua lua-4.0

我正在阅读Lua 4.0手册,我遇到了这个"标签"事情,但我不知道它是指什么。

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

这是它提到的部分,但我仍然不知道手册在说什么。

1 个答案:

答案 0 :(得分:5)

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


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

  

除了类型之外,所有值都有一个标记。

     

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

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

  • nilnumberstringfunction(C风味),function(Lua风味)类型的所有值都有C侧的特定类型标签。

  • tableuserdata类型的所有值都有标签,但程序员会为每个值独立设置。

tag返回标记,settagtableuserdata设置标记,newtag创建新标记。

查看4.8节"标记方法",我们知道这些唯一ID仅用于舒适地关联相同Lua类型的所有值(或table s和{{1具有特殊行为的相同语义用户类型:

  

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

     

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

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

正如LHF在下面提到的那样,The evolution of Lua中还有大量额外的细节和历史,例如标签方法是如何从先前的"后退"的扩展机制演变而来的,它不支持不同的值组的不同行为,而是全局的。

相关问题