Lua中的metatable介绍
setmetatable(table,metatable)
Lua中的每个值都可以用一个metatable。这个metatable就是一个原始的Luatable,它用来定义原始值在特定操作下的行为。你可以通过在metatable中的特定域设一些值来改变拥有这个metatable的值的指定操作之行为。举例来说,当一个非数字的值作加法操作的时候,Lua会检查它的metatable中"__add"域中的是否有一个函数。如果有这么一个函数的话,Lua调用这个函数来执行一次加法。
我们叫metatable中的键名为事件(event),把其中的值叫作元方法(metamethod)。在上个例子中,事件是"add"而元方法就是那个执行加法操作的函数。
你可以通过getmetatable函数来查询到任何一个值的metatable。
你可以通过setmetatable函数来替换掉table的metatable。你不能从Lua中改变其它任何类型的值的metatable(使用debug库例外);要这样做的话必须使用CAPI。
每个table和userdata拥有独立的metatable(当然多个table和userdata可以共享一个相同的表作它们的metatable);其它所有类型的值,每种类型都分别共享唯一的一个metatable。因此,所有的数字一起只有一个metatable,所有的字符串也是,等等。
一个metatable可以控制一个对象做数学运算操作、比较操作、连接操作、取长度操作、取下标操作时的行为,metatable中还可以定义一个函数,让userdata作垃圾收集时调用它。对于这些操作,Lua都将其关联上一个被称作事件的指定健。当Lua需要对一个值发起这些操作中的一个时,它会去检查值中metatable中是否有对应事件。如果有的话,键名对应的值(元方法)将控制Lua怎样做这个操作。
metatable可以控制的操作已在下面列出来。每个操作都用相应的名字区分。每个操作的键名都是用操作名字加上两个下划线'__'前缀的字符串;举例来说,"add"操作的键名就是字符串"__add"。这些操作的语义用一个Lua函数来描述解释器如何执行更为恰当。
setmetatable
Setsthemetatableforthegiventable.(YoucannotchangethemetatableofothertypesfromLua,onlyfromC.)Ifmetatableisnil,removesthemetatableofthegiventable.Iftheoriginalmetatablehasa"__metatable"field,raisesanerror.
Thisfunctionreturnstable.