元表不被索引,尽管使用了 setmetatable。

根据 Lua 手册,setmetatable 在 Lua 5.0 和其后的版本中仍然相同。然而,当我在 Lua 5.1.5 和 5.3.1 中尝试以下代码时,出现了元表未被访问的情况:

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

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

-- 不起作用
assert(getmetatable(inst) == ClassTable)
print(inst:getString())

第一种情况可以工作,然而在第二种情况中,我得到了错误提示,这表明元表没有被使用:

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

这也与方法调用操作符 : 无关,即使获取方法的值也没有使用元表:

print(inst.getString)
nil
点赞
用户3586583
用户3586583

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

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

ClassTable.__index = ClassTable

尽管名字是这样,__index元方法不需要是一个函数:它可以是一个表。当它是一个函数时,Lua会将表格和不存在的键作为参数调用它。当它是一个表时,Lua会在该表中重新进行访问。

2015-12-13 22:23:51