当在构造函数内调用时,该函数返回nil。

我刚开始学习使用lua编程,并创建了一种类似面向对象的结构,按照以下教程: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)

,我会得到错误:"Error: main.lua:14: attempt to index field 'var' (a nil value)"。 但是,当我执行以下操作时:

myObject = ObjectA:new(5)
myObject.var = ObjectA:foo(5) //调用构造函数之外的foo函数设置var
print(myObject.var.num)

,一切似乎都正常工作,打印结果确实是5。可以有人告诉我这种奇怪行为的原因或我在这里做错了什么吗?

点赞
用户1009479
用户1009479

默认情况下,变量是全局的,因此ObjectA:newObjectB:new中的两个变量newInstance是相同的全局变量,你给它赋一个新值,之前的值就不存在了。

相反,应该像这样使用局部变量:

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

function ObjectB:new(num)
    local newInstance = {}
    --the rest
end
2014-06-04 13:32:20