【问题标题】:Function returns nil when called inside constructor函数在构造函数中调用时返回 nil
【发布时间】:2014-07-25 03:56:19
【问题描述】:

我刚开始使用 lua 编程,并按照本教程创建了某种 oop 结构:http://tylerneylon.com/a/learn-lua/

问题是,当我创建返回对象或对象表的函数并在构造函数中调用它时,它返回 nil。

这是我的第一个对象的代码:

require "ObjectB"

ObjectA = {}

function ObjectA:new(num)
    newInstance = {}

    newInstance.var = self:foo(num)

    self.__index = self
    return setmetatable(newInstance, self)
end

function ObjectA:foo(num)
    return ObjectB:new(num)
end

,对于第二个对象:

ObjectB = {}

function ObjectB:new(num)
    newInstance = {}

    newInstance.num = num

    self.__index = self
    return setmetatable(newInstance, self)
end

当我这样做时:

myObject = ObjectA:new(5)
print(myObject.var.num)

,我收到错误:“错误:main.lua:14:尝试索引字段 'var'(一个 nil 值)”。 但是当我这样做时:

myObject = ObjectA:new(5)
myObject.var = ObjectA:foo(5) //setting var by calling foo outside of constructor
print(myObject.var.num)

,一切似乎都运行良好,打印结果确实是 5。谁能告诉我这种奇怪行为的原因是什么,或者我在这里做错了什么?

【问题讨论】:

    标签: oop lua


    【解决方案1】:

    变量默认是全局的,所以ObjectA:newObjectB:new中的两个变量newInstance是同一个全局变量,你给它一个新的值,之前的值就没有了。

    相反,使用这样的局部变量:

    function ObjectA:new(num)
        local newInstance = {}
        --the rest
    end
    

    function ObjectB:new(num)
        local newInstance = {}
        --the rest
    end
    

    【讨论】:

    • OP链接的教程犯了同样的错误。它不会在其 OOP 部分的任何地方使用“local”关键字。忘记“本地”可能会导致一些非常令人沮丧的错误。
    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多