2014-12-03 2 views
2

Я пытаюсь создать простой класс с функцией-членом, которая будет печатать некоторые значения-члены, но я получаю ошибки, когда пытаюсь ссылаться на «я»:Невозможно получить функцию Lua для ссылки «self»

attempt to index global 'self' (a nil value) 

Вот сценарий, я пытаюсь запустить:

Test = {} 

function Test:new() 
    T = {} 
    setmetatable(T, self) 
    self.__index = self 
    self.Name = "Test Object" 
    return T 
end 

function Test:printName() 
    print("My name is " .. self.Name) -- This causes the error 
end 

Я также попытался self:Name, но я получаю подобную ошибку. Что я здесь делаю неправильно?

EDIT:

Забыл упомянуть, что я называю printName() функцию из кода C++. Если я вызываю функцию из Lua, она работает правильно.

Объект Test создан в Lua и выполняется функция обратного вызова. Функция вызывается в C++, как это:

luabridge::LuaRef testObjectRef = ...; // This is populated from Lua, refers to the printName() function 
testObjectRef(); // Calls the function 

обратного вызова в скрипте делается так:

-- in Test:new() 
self.Callback = LuaCallback(self.printName) 
Helper.setCallback(self.Callback) 

обратного вызова сам работает отлично, если я не пытаюсь обратиться к self. Ошибка возникает только тогда, когда я пытаюсь это сделать.

+0

'self.Name' * * правильный синтаксис. Лемм управляет им. –

+0

Показать код, используемый для вызова его из C++. Вы нажимаете параметр 'self' в стеке? (C API не имеет понятия ':' call!) –

+0

А теперь * вы забыли сказать, что используете luabridge? !!?! *. Пожалуйста, снова прочитайте раздел «about». И я рекомендую использовать [** Sol **] (https://github.com/Rapptz/sol) вместо этого, luabridge чрезвычайно мех, на мой взгляд. –

ответ

1

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

-- in the script 
self.Callback = LuaCallback(self, self.printName) 
Helper.setCallback(self.Callback) 
1

Я взял код, добавил:

local test = Test:new() 
test:printName() 

Это дает мне правильный вывод.

My name is Test Object 

Если вы вызываете его через C API, вы должны помнить, чтобы вручную толкать self аргумент в стек. Помните, что:

obj:fun() ~ obj.fun(obj) 
+0

Это тоже работает для меня, но если я вызову метод из C++, я получаю вышеупомянутую ошибку. – manabreak

+0

@manabreak, почему бы вам не упомянуть, что вы вызываете его из C++? Почему бы вам опустить такую ​​важную деталь? –

+0

Я только пробовал называть его с C++ раньше, и теперь, когда я пытался называть его из Lua, он работал. – manabreak