根据Lua手册,setmetatable仍然与Lua5.0一样工作。然而,由于某种原因,当我在Lua5.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())第一种情况有效,但是在第二种情况下,I得到了一个错误,这表明不使用metatable:
./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发布于 2015-12-13 22:23:51
要使表inst访问元方法,需要使用元方法__index。
因此,您可以通过在ClassTable.getString定义下面的顶部添加这一行来更正代码:
ClassTable.__index = ClassTable不管名称如何,__index元方法不需要是函数:它可以是一个表,而不是一个表。当它是一个函数时,Lua用表和缺席键作为它的参数调用它。当它是一个表时,Lua将重新执行该表中的访问。
https://stackoverflow.com/questions/34257013
复制相似问题