尝试在Lua中创建对象时得到“试图索引nil值错误”

时间:2019-04-14 20:25:08

标签: lua

我正在将一些代码放入模块,以便可以绘制和维护多个副本。我遇到了这个常见错误,但我不明白为什么。我了解它的基本含义,但是由于能够从正在创建的表中看到打印内容,因此我不明白为什么调用模块包含的函数会引发此错误。

我已经阅读了关于SO的所有答案,但我仍然茫然。我尝试在各个阶段进行打印,以查看问题出在哪里,所有操作都像我创建了模块实例一样,但是错误仍然存​​在。

下面的代码清除了多余的内容。

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 Orbital_Circle = {}

-- set up variables
local some Vars Are here

function Orbital_Circle.new(x, y, diameter, scale_factor, number_of_notes, beats_per_second, frames_per_second, sequence_data)
    print("Orbital_Circle running")
end

function Orbital_Circle:doFunc(param)
    self.var = param  <-- I update a local var here
        print("self.var")  <-- I then print the updated number for sanity checking
end

return Orbital_Circle

我希望此模块实例中的var可以更新,并且函数代码可以运行,但是……不高兴。我得到了错误。

干杯。

2 个答案:

答案 0 :(得分:2)

  

我正在将一些代码放入模块中,以便可以绘制和维护多个副本。

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

在Lua中 {% for item in list %} {{ rp }} {% endfor %} 模块时,同一文件的每个后续require都引用相同的代码。因此,(例如)这两个变量包含完全相同的代码:

require

这意味着您不能像尝试那样单独使用Lua模块来创建OOP类型的对象。您的local orbitalCircle1 = require('lib/orbital_circle') local orbitalCircle2 = require('lib/orbital_circle') 函数必须返回一些可以使用的东西,例如类的实例,每个调用的唯一表:

new

您还可以将方法定义为local Orbital_Circle = {} local shared_variable = 1 function Orbital_Circle.new(x, y) -- create unique table local obj = {} -- access these from table/object methods with self.xxx obj.x = x or 0 obj.y = y or 0 obj.var = "initial value" -- now define functions with an explicit 'self' parameter... function obj.doFunc(self, param) self.var = self.var .. " " .. param shared_variable = shared_variable + 1 end -- ... or with the syntactic 'self' sugar, ':' function obj:printVars() print("self.var = " .. self.var) print("shared_variable = " .. shared_variable) print("self.x = " .. self.x) end return obj end return Orbital_Circle 函数之外的local function个方法,这些方法具有new参数并具有条目列表,例如:

self

...如果愿意,可以使事情保持整洁。

答案 1 :(得分:0)

您的代码完全混乱了。

<--将导致意外符号错误。

 c1 = orbitalCircle.new(20, 42, 18, 1.7, 16, 62, 15, c1Sequence)

由于orbitalCircle.new没有返回值,因此会为索引全局nil值c1带来错误。

您的init函数不完整,您不会调用它,因此即使您修复了上述错误,所提供的代码也不会执行任何操作。

报告的错误不是由您在此处提供的任何代码行引起的。

  

下面的代码清除了多余的内容。

恐怕您删除的太多了。

错误消息告诉您正在索引本地n,这是n范围内定义的本地函数中的空值。

例如以下代码:

local n
function test()
  local b = n.a
end
test()

将导致错误消息:

input:3: attempt to index a nil value (upvalue 'n')

ntest的上限值,因为它是在函数主体之外定义的局部变量,而不是全局变量。