根据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
答案 0 :(得分:2)
要使表inst
访问元表,您需要使用元方法__index
。
因此,您可以通过在ClassTable.getString
定义下方的顶部添加此行来更正代码:
ClassTable.__index = ClassTable
尽管有名字,但__index元方法确实如此 不需要是一个函数:它可以是一个表,而不是。当它是一个 函数,Lua用表和缺席键调用它 参数。当它是一个表时,Lua重做该表中的访问权。