Ошибка при попытке вызвать метод класса: попытка индексировать локальное «я» (нулевое значение) — Lua

Я создаю сценарий lua, который должен работать на калькуляторе TI-Nspire. Проблема в том, что при запуске моего скрипта я получаю ошибку Attempt to index local 'self' (a nil value) при вызове метода button:activate(). Парсер говорит, что ошибка находится в 8-й строке кода ниже. Проблемный код выглядит следующим образом:

button = class(view)

function button:init()
    self.selected = false
end

function button:activate()
    self.selected = true
end

Я вызываю функцию активации следующим образом:

item = button()
local action = "activate"
local arguments = {}
item[action](unpack(arguments))

Я знаю, что функция class() не существует в «стандартном» Lua, это функция, доступная в реализации TI-Nspire Lua. Вы можете найти его определение и использование здесь.


person Frog    schedule 08.09.2011    source источник
comment
Название вопроса не информативно.   -  person lhf    schedule 08.09.2011
comment
Извините, я отредактировал заголовок. Это лучше?   -  person Frog    schedule 09.09.2011


Ответы (1)


obj:methodname(args) это сахар для obj.methodname(obj,args). Итак, если вы хотите использовать синтаксис item[action](unpack(arguments)), вам нужно использовать item[action](item,unpack(arguments)). В противном случае попробуйте item:activate(unpack(arguments)), если вы можете использовать метод явно.

person lhf    schedule 08.09.2011
comment
Спасибо за Ваш ответ! Я не могу вызвать метод явно, поэтому я выбрал item[action](item, unpack(arguments)), но это не решает мою проблему полностью... Да, сообщение об ошибке исчезло, но оно заменено новым в строке, вызывающей метод . Новое сообщение об ошибке: attempt to call field '?' (a nil value). Вы случайно не знаете, как это решить? Спасибо! - person Frog; 09.09.2011
comment
@Frog, это сообщение указывает на то, что action не является именем метода, который есть у item. Возможно опечатка? - person lhf; 09.09.2011
comment
Действительно, действие — это не имя метода, а строка, которая является именем метода. Я уверен, что здесь нет опечатки, потому что в моем исходном примере была вызвана правильная функция (которая вызывала статический метод). Вы знаете, что может быть не так? Спасибо! - person Frog; 09.09.2011
comment
@Frog, попробуй print(item,action,item[action]) перед звонком. - person lhf; 09.09.2011
comment
Я не могу использовать print() (потому что TI не показывает вывод, а только отправляет его на последовательный порт), но вместо этого я просто вывожу строки на экран. Переменная item каждый раз была разной, у меня когда-то была: таблица: 10e77440. Переменная action была либо активирована, наведена на мышь, наведена на мышь в зависимости от действия, и, наконец, item[action] als равнялась нулю. Я предполагаю, что это означает, что item[action] не определено. Но как это возможно, когда я могу позвонить item:activate()? - person Frog; 09.09.2011
comment
@Frog попробуй нарисовать item.activate. Выводит ли функция #something или ноль? - person kikito; 13.09.2011
comment
Привет Кикито! Спасибо за все ваши ответы. Я исправил проблему. Спасибо! - person Frog; 25.09.2011