我正在将一些代码放入模块,以便可以绘制和维护多个副本。我遇到了这个常见错误,但我不明白为什么。我了解它的基本含义,但是由于能够从正在创建的表中看到打印内容,因此我不明白为什么调用模块包含的函数会引发此错误。
我已经阅读了关于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可以更新,并且函数代码可以运行,但是……不高兴。我得到了错误。
干杯。
答案 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')
n
是test
的上限值,因为它是在函数主体之外定义的局部变量,而不是全局变量。