函数调用中的神秘stackoverflow?

Mysterious stackoverflow in function call?

我正在创建一个 Lua 程序,我尝试使用继承之类的东西,但是当我调用函数的 super 时出现堆栈溢出。

function Parent()
    local self = {}

    self.println = function(text) print(text) end
    return self
end


function Child()
    local super = Parent()
    local this = {}

    this.println = function(text)
        super.println(text) -- According to the debugger, here is the problem.
        print("Child")
    end

    for k, v in pairs(this) do
        super[k] = v
    end

    return this
end

local a = Child()
a.println("Hello!") 

我知道还有其他方法可以做到这一点,但我必须使用这种"OOP"。谁能推荐我什么?

for k, v in pairs(this) do 循环对我来说似乎是倒退的。

您正在将函数的 this 副本推送到 super table(覆盖已经存在的那些)。

所以你将 this.println 推入 super,然后在其中调用 super.println,最后你会反复调用自己。

您的意思是相反吗?将 super 函数复制到 this?或者这个循环最初的意义是什么?

您的问题在于使所有 println 函数成为同一个 println 函数的循环,该函数将调用重定向到另一个 printnl 函数,这实际上是同一个 print 函数,从而创建了一个循环。

for k, v in pairs(this) do
    super[k] = v
end

删除该循环将使代码正常工作,但我不确定这是否会使它按您想要的方式运行。 如果你想继承方法,也许你应该看看 lua 元表。