我刚刚开始使用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'(零值)”。 但是当我这样做时:
myObject = ObjectA:new(5)
myObject.var = ObjectA:foo(5) //setting var by calling foo outside of constructor
print(myObject.var.num)
,一切似乎都很好,打印结果真的是5.有人能告诉我这种奇怪行为的原因是什么,或者我在这里做错了什么?
答案 0 :(得分:4)
默认情况下,变量是全局变量,因此newInstance
和ObjectA:new
中的两个变量ObjectB:new
是相同的全局变量,您为其分配一个新值,之前的值已消失。
相反,使用这样的局部变量:
function ObjectA:new(num)
local newInstance = {}
--the rest
end
和
function ObjectB:new(num)
local newInstance = {}
--the rest
end