4

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

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

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

4

1 回答 1

6

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


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

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

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

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

  • 类型nil, number, string, function(C-flavor), function(Lua flavor) 的所有值都在 C 端设置了特定于类型的标签。

  • 类型的所有值tableuserdata有标签,但这些值是由程序员为每个独立于其他值的值设置的。

tag返回标签,settag将其设置为tableand userdatanewtag创建一个新标签。

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

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

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

这只是归结为settagmethodgettagmethod用于管理从标记+事件到处理程序的映射,以及使用它作为扩展点的运行时。

正如 LHF 在下面提到的,Lua 的演变中有大量额外的细节和历史,例如标签方法是如何从以前的“回退”扩展机制演变而来的,它不支持不同值组的不同行为,而是全球性的。

于 2015-01-15T21:26:58.477 回答