为什么.__index只从子类而不是基类返回函数

  • 本文关键字:基类 返回 函数 index 子类 oop lua
  • 更新时间 :
  • 英文 :

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,输出仍然无限打印"浆果正在运行"。我该如何纠正此问题?任何帮助将不胜感激

您已经覆盖了berryitemRun功能,这使得它更难到达。 此覆盖会导致您的无限循环,因为self.__index是对self的引用,这是一个berry现在Run是在 berry 中定义的__indexberry被索引时将不再调用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()

打印项目正在运行

最新更新