函数调用中神秘的stackoverflow?

时间:2016-01-04 20:05:43

标签: function lua stack-overflow

我正在创建一个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) -- 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”。谁能推荐我什么?

2 个答案:

答案 0 :(得分:1)

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

您正在将this个函数副本推送到super表(覆盖已存在的表)。

因此,您将this.println推入super,然后在其中调用super.println,最后您会反复打电话给自己。

你的意思是反过来这样做吗?将super个功能复制到this?或者首先是那个循环有什么意义呢?

答案 1 :(得分:1)

你的问题在于循环使得所有println函数都是相同的println函数,它将调用重定向到另一个printnl函数,这实际上是相同的print函数,创建一个循环。

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

删除该循环将使代码工作,但我不确定这是否使其行为符合您的要求。 如果你想继承方法,也许你应该看一下lua metatables。