首页 > 代码库 > lua元表(metatable)和元方法(metamethod)

lua元表(metatable)和元方法(metamethod)

元表概念:

  • 引言:Lua中的每个值都有一套预定义的操作集合,如数字相加等。但无法将两个table相加,此时可通过元表修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定操作。

  • 访问机制:一般的元方法都只针对Lua的核心,也就是一个虚拟机。它会检测一个操作中的值是否有元表,这些元表是否定义了关于次操作的元方法。例如两个table相加,先检查两者之一是否有元表,之后检查是否有一个叫“__add”的字段,若找到,则调用对应的值。“__add”等即时字段,其对应的值(往往是一个函数或是table)就是“元方法”。

      • 元表实例

        • setmetatable(只能用于table)和getmetatable(用于任何对象)

          • 语法:setmetatable (table, metatable),对指定table设置metatable      【如果元表(metatable)中存在__metatable键值,setmetatable会失败】

          • 语法:tmeta = getmetatable (tab),返回对象的元表(metatable)             【如果元表(metatable)中存在__metatable键值,当返回__metatable的值】

        • 算术类元方法:     字段:__add  __mul  __ sub  __div  __unm  __mod  __pow  (__concat)
        • 关系类元方法: 字段:__eq __lt(<) __le(<=),其他Lua自动转换 a~=b --> not(a == b) a > b --> b < a a >= b --> b <= a 【注意NaN的情况】
        •  
        • table访问的元方法: 字段: __index __newindex

          • __index: 
                查询:访问表中不存的字段 
                rawget(t, i)

          • __newindex: 
                更新:向表中不存在索引赋值 
                rawswt(t, k, v)

    • 一些例子

 运行结果:

 

 "sub": - 操作。 行为类似于“add”操作。 
"mul": * 操作。 行为类似于“add”操作。 
"div": / 操作。 行为类似于“add”操作。 
"mod": % 操作。 行为类似于“add”操作。以o1 - floor(o1/o2)*o2为操作原语。 
"pow": ^ (取幂)操作。 行为类似于“add”操作,以函数pow(来自C数学库)为操作原语。 
"unm": 一元-操作。