我正在阅读Lua 4.0手册,我遇到了这个"标签"的东西,但我不知道它指的是什么.
http://www.lua.org/manual/4.0/manual.html#3
这是它提到它的部分,但我仍然不知道手册正在谈论什么.
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侧设置.
类型的所有值table也userdata都有标签,但是程序员为每个值独立设置这些值.
tag返回的标签,settag将其设置为table和userdata,newtag创建一个新的.
在查看4.8节"标记方法"时,我们了解到这些唯一ID仅用于将相同Lua类型(或同一语义用户类型的tables和userdatas)的所有值与特殊行为轻松关联:
Lua提供了一种强大的机制来扩展其语义,称为标记方法.标记方法是程序员定义的函数,在执行Lua程序期间在特定关键点调用,允许程序员在这些点更改标准的Lua行为.这些点中的每一个都称为事件.
根据事件中涉及的值的标记选择为任何特定事件调用的标记方法(参见第3节).该函数
settagmethod更改与给定对(标记,事件)关联的标记方法.它的第一个参数是标记,第二个参数是事件名称(一个字符串;见下文),第三个参数是新方法(一个函数),或者是nil,用于恢复该对的默认行为.该settagmethod函数返回该对的前一个标记方法.伴随函数gettagmethod接收标记和事件名称,并返回与该对关联的当前方法.
这只是归结为settagmethod并gettagmethod用于管理从tag + event到handler的映射,以及使用它作为扩展点的运行时.
正如LHF在下面提到的那样,在Lua的演变中有很多额外的细节和历史,例如标签方法是如何从之前的"后备"扩展机制演变而来的,后者不支持不同行为的不同行为,而是全球化.
| 归档时间: |
|
| 查看次数: |
773 次 |
| 最近记录: |