Metatable未编入索引,即使使用了setmetatable

时间:2015-12-13 22:13:10

标签: lua lua-table metatable lua-5.1 lua-5.3

根据Lua手册,setmetatable仍然与Lua 5.0中的相同。但出于某种原因,当我在Lua 5.1.5和5.3.1中尝试此代码时,似乎没有访问metatable:

ClassTable = {}
ClassTable.getString = function(self) 
  return self.x .. ""
end

inst = {}
setmetatable(inst, ClassTable)
inst.x = 7

--doens't work
assert(getmetatable(inst) == ClassTable)
print(inst:getString())

第一种情况有效,但在第二种情况下,我得到的错误表明metatable未被使用:

./lua: /test.lua:12: attempt to call method 'getString' (a nil value)
stack traceback:
    test.lua:12: in main chunk
    [C]: ?

这也与方法调用操作符":"无关。因为即使获得该方法的价值也不会进入metatable。

print(inst.getString)
nil

1 个答案:

答案 0 :(得分:2)

要使表inst访问元表,您需要使用元方法__index

因此,您可以通过在ClassTable.getString定义下方的顶部添加此行来更正代码:

ClassTable.__index = ClassTable
  

尽管有名字,但__index元方法确实如此   不需要是一个函数:它可以是一个表,而不是。当它是一个   函数,Lua用表和缺席键调用它   参数。当它是一个表时,Lua重做该表中的访问权。