获得;尝试索引零值错误“;尝试在Lua中创建对象时

获得;尝试索引零值错误“;尝试在Lua中创建对象时,lua,Lua,我将一些代码放入一个模块中,这样我就可以绘制和维护多个副本。我得到了这个常见的错误,但我不明白为什么。我基本上理解它在说什么,但是由于我能够看到正在创建的表的打印输出,我不理解为什么调用模块包含的函数会抛出这个错误 我已经通读了所有的答案,但我还是不知所措。我试着在不同的阶段打印出来,看看问题出在哪里,一切都像我创建了一个模块实例一样工作,但错误仍然存在 下面的代码清除了无关的内容 local orbitalCircle = include('lib/orbital_circle') func

我将一些代码放入一个模块中,这样我就可以绘制和维护多个副本。我得到了这个常见的错误,但我不明白为什么。我基本上理解它在说什么,但是由于我能够看到正在创建的表的打印输出,我不理解为什么调用模块包含的函数会抛出这个错误

我已经通读了所有的答案,但我还是不知所措。我试着在不同的阶段打印出来,看看问题出在哪里,一切都像我创建了一个模块实例一样工作,但错误仍然存在

下面的代码清除了无关的内容

local orbitalCircle = include('lib/orbital_circle')

function init()
  c1 = orbitalCircle.new(20, 42, 18, 1.7, 16, 62, 15, c1Sequence)
  <-- at this point print code from the module's init function works
  c1:doFunc(param)  <-- this will call the error
local orbitalCircle=include('lib/orbitalCircle')
函数init()
c1=轨道圆。新(20,42,18,1.7,16,62,15,C15序列)

你的代码完全搞乱了


您的代码完全乱七八糟


我将一些代码放入一个模块中,这样我就可以绘制和维护多个副本

我认为对于Lua模块在这里的工作方式有点误解。这是一个容易犯的错误

当您
require
Lua中的模块时,同一文件的每个后续
require
都引用相同的代码。所以(例如)这两个变量包含完全相同的代码:

local-orbitalCircle1=require('lib/orbitalcircle')
局部轨道圆2=require('lib/轨道圆')
这意味着您不能像您试图做的那样单独使用Lua模块来创建OOP类型的对象。您的
new
函数必须返回一些可以使用的内容,例如类的实例、每个调用的唯一表:

局部轨道_圆={}
局部共享_变量=1
新函数轨道_圆(x,y)
--创建唯一表
局部obj={}
--使用self.xxx从表/对象方法访问这些
对象x=x或0
对象y=y或0
obj.var=“初始值”
--现在定义带有显式“self”参数的函数。。。
函数obj.doFunc(self,param)
self.var=self.var。。" " .. param
共享变量=共享变量+1
结束
-- ... 或者用句法上的“self”sugar:“
函数obj:printVars()
打印(“self.var=“…self.var”)
打印(“共享_变量=“…共享_变量”)
打印(“self.x=“…self.x”)
结束
返回obj
结束
返回轨道环
您还可以将方法定义为
local function
s(位于
new
函数之外),该函数具有
self
参数,并具有如下条目列表:

obj.anotherMethod = functionDeclaredAtTopOfFile
…如果你愿意的话,让事情更整洁

我将一些代码放入一个模块中,这样我就可以绘制和维护多个副本

我认为对于Lua模块在这里的工作方式有点误解。这是一个容易犯的错误

当您
require
Lua中的模块时,同一文件的每个后续
require
都引用相同的代码。所以(例如)这两个变量包含完全相同的代码:

local-orbitalCircle1=require('lib/orbitalcircle')
局部轨道圆2=require('lib/轨道圆')
这意味着您不能像您试图做的那样单独使用Lua模块来创建OOP类型的对象。您的
new
函数必须返回一些可以使用的内容,例如类的实例、每个调用的唯一表:

局部轨道_圆={}
局部共享_变量=1
新函数轨道_圆(x,y)
--创建唯一表
局部obj={}
--使用self.xxx从表/对象方法访问这些
对象x=x或0
对象y=y或0
obj.var=“初始值”
--现在定义带有显式“self”参数的函数。。。
函数obj.doFunc(self,param)
self.var=self.var。。" " .. param
共享变量=共享变量+1
结束
-- ... 或者用句法上的“self”sugar:“
函数obj:printVars()
打印(“self.var=“…self.var”)
打印(“共享_变量=“…共享_变量”)
打印(“self.x=“…self.x”)
结束
返回obj
结束
返回轨道环
您还可以将方法定义为
local function
s(位于
new
函数之外),该函数具有
self
参数,并具有如下条目列表:

obj.anotherMethod = functionDeclaredAtTopOfFile

…如果您愿意的话,请保持整洁。

Lua将为错误提供文件/行号。上面说什么?是否有“n”变量?请提供一个Lua,它将给出错误的文件/行号。上面说什么?您是否有“n”变量?请为反馈喝彩。我知道我的代码乱七八糟,我发现Lua很奇怪,我花了比我想象的更长的时间去理解。但是这是生活的一部分,对吧:)@tortexlua其实很简单。你会很快学会的。顺便说一句,你应该接受一个能回答你问题的答案,而不是对你在代码中出错的其他问题给出一些随机的建议。这可能会让后来来这里的其他人感到困惑。。。你的问题是为什么你会收到那个特别的错误信息。不是如何在Lua中实现OOP,顺便说一句,Lua错误地解释了OOP,或者至少没有充分地解释OOPPaulR@Piglet:你回复了标题,而我采用了更广泛的启发,让Tortex参与他们的整个帖子,因为他们已经知道错误消息的含义:“我明白它在说什么……”。所以我的回答不是“一些随机的建议”,它实际上解决了真正的问题,而你没有。我也从未声称提供了最好的/唯一的,甚至任何特定的OOP实现,唯一能解决OPs问题的代码。是的。@PaulR不,他说他不知道为什么会出现这个错误,为什么调用函数会导致这个错误。这就是我向他解释的。我的意思是,如果创建的对象不共享公共元表,那么告诉他使用require而不是include有什么意义呢。。。你给了他一些建议,告诉他如何改进他代码中与帖子主题无关的部分。没关系,但是
local n
function test()
  local b = n.a
end
test()
input:3: attempt to index a nil value (upvalue 'n')
obj.anotherMethod = functionDeclaredAtTopOfFile