item = {y = 21}
function item:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function item:Run()
print("item running")
end
berry = item:new{x = 52}
function berry:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function berry:Run()
print("berry is running")
self.__index:Run()
end
berry:new{b = 32}:Run()
输出是无限打印"浆果正在运行",而它应该打印"浆果正在运行",然后是"项目正在运行"。如果我将self.__index
更改为self.__index.__index
甚至self.__index.__index.__index
,输出仍然无限打印"浆果正在运行"。我该如何纠正此问题?任何帮助将不胜感激
您已经覆盖了berry
中item
的Run
功能,这使得它更难到达。 此覆盖会导致您的无限循环,因为self.__index
是对self
的引用,这是一个berry
。现在Run
是在 berry 中定义的__index
当berry
被索引时将不再调用Run
所以你的berry:Run
函数本质上是
function berry:Run()
print("berry is running")
berry:Run()
end
我建议你改变你的berry:Run
函数,并专门调用其中的item.Run
:
function berry:Run()
print("berry is running")
item.Run(self) -- specifically call item.Run and pass it self.
end
这将为您提供所需的输出:
贝瑞正在运行
项目运行
或者,您可以通过在运行前在 berry 中定义它来坚持item:Run
函数:
berry.ParentRun. = berry.Run -- this will cause __index to run and get item:Run
function berry:Run() -- This now defines berry.Run. now __index will no longer run for berry.Run
print("berry is running")
self:ParentRun()
end
<小时 />额外说明:
你看到的原因
贝瑞正在运行
贝瑞正在运行
项目运行
从评论中的建议来看,是因为运行的顺序将是
object:Run() -- this calls berry passing the self of object
打印我们的第一个浆果正在运行
现在我们获取该对象的元表,即 Berry,并调用它运行
berry:Run()
打印我们的第二个浆果正在运行
最后,我们得到 Berry 的元表,它是项目并调用它运行
item:Run()
打印项目正在运行