2

根据 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

--doens't work
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
4

1 回答 1

2

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

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

ClassTable.__index = ClassTable

尽管有这个名字,__index 元方法不需要是一个函数:它可以是一个表,而是。当它是一个函数时,Lua 用表和缺失的键作为它的参数来调用它。当它是一个表时,Lua 会重做对该表的访问。

于 2015-12-13T22:23:51.467 回答