函数调用中的神秘stackoverflow?

我正在创建一个 Lua 程序,我尝试使用类似继承的东西,但当我调用函数的超类时,我得到了一个堆栈溢出。

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) -- 根据调试器,这里是问题。
        print("Child")
    end

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

    return this
end

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

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

点赞
用户258523
用户258523

那个 for k, v in pairs(this) do 循环似乎是反过来的。

你正在将 this 副本的函数推入 super 表中(覆盖已经存在的函数)。

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

你是想反过来做吗?将 super 函数复制到 this 中?或者你一开始的意图是什么?

2016-01-04 20:22:14
用户3586583
用户3586583

你的问题在于那个循环,它使得所有的println函数都成为了同一个println函数,该函数将调用重定向到另一个printnl函数,该函数实际上是同一个print函数,从而造成循环。

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

删除该循环将使代码正常工作,但我不确定这是否会使其按照你的意愿运行。 如果你想继承方法,也许应该查看一下 Lua 元表。

2016-01-04 20:23:04