Получение «попытки индексировать ошибку с нулевым значением» при попытке создания объектов в Lua - PullRequest
0 голосов
/ 14 апреля 2019

Я помещаю некоторый код в модуль, чтобы я мог рисовать и поддерживать несколько копий. Я получаю эту общую ошибку, но я не понимаю, почему. Я понимаю, что он говорит на базовом уровне, но, поскольку я могу видеть распечатку из создаваемой таблицы, я не понимаю, почему вызов функции, содержащейся в модуле, вызовет эту ошибку.

Я прочитал все ответы на 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 ]

2 голосов
/ 15 апреля 2019

Я помещаю некоторый код в модуль, чтобы я мог рисовать и поддерживать несколько копий.

Я думаю, что есть некоторое недопонимание о том, как работают модули Lua. Это простая ошибка.

Когда вы require модуль в Lua, каждый последующий require одного и того же файла ссылается на один и тот же код. Так (например) эти две переменные содержат абсолютно одинаковый код:

local orbitalCircle1 = require('lib/orbital_circle')
local orbitalCircle2 = require('lib/orbital_circle')

Это означает, что вы не можете использовать модули Lua сами для создания объектов типа ООП, как вы пытаетесь это сделать. Ваша 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 s вне функции new, которые имеют параметр self и имеют список записей, таких как:

obj.anotherMethod = functionDeclaredAtTopOfFile

... чтобы держать вещи в порядке, если хотите.

0 голосов
/ 15 апреля 2019

Ваш код полностью испорчен.

<-- вызовет ошибку для неожиданного символа.

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

выдаст ошибку для индексации глобального значения nil c1, поскольку orbitalCircle.new не имеет возвращаемого значения.

ваша функция инициализации неполная, и вы не вызываете ее, поэтому предоставленный код ничего не делает, даже если вы исправите вышеуказанные ошибки.

Указанная ошибка не вызвана ни одной строкой кода, предоставленной здесь.

Код, приведенный ниже, очищен от посторонних предметов.

Боюсь, вы слишком много удалили.

Сообщение об ошибке сообщает, что вы индексируете локальное n, значение nil из локальной функции, которая была определена в области действия n.

Этот код, например:

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

приведет к сообщению об ошибке:

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

n является повышением для test, поскольку это локальная переменная, определенная вне тела функции, но не глобальная переменная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...