Привязка табличной функции Lua к переменной C ++ с использованием LUAPlus

Я хочу связать табличную функцию Lua с переменной C ++, используя LUAPlus. До сих пор, используя информацию, которую я могу найти в Интернете, мне удалось вызвать табличную функцию, используя DoString("tableName:functionName"), но я хочу иметь возможность вызывать функцию через переменную. Я знаю, что это возможно, но я не могу понять, что я делаю неправильно.

В коде, который я добавил, pLuaState->DoString("table1:prints()") работает отлично и печатает все по мере необходимости.
Когда я пытаюсь получить функцию и вызвать ее с помощью переменной func, моя программа падает

сообщение об ошибке

Ошибка подтверждения: 0, файл … / luafunciton.h, строка 41

Если я удаляю все отпечатки в функции prints () в Lua, кроме «print (« in prints »)», все работает нормально. Исходя из этого, я предполагаю, что GetByName("functionName") возвращает функцию, которая не содержит ссылку на свою родительскую таблицу. И вот тут я застреваю.

main.cpp

pLuaState = LuaPlus::LuaState::Create(true);
pLuaState->DoFile("test.lua");
LuaObject globals = pLuaState->GetGlobals();

LuaObject metaTableObj = pLuaState->GetGlobals().Lookup("RandomMove");
if (metaTableObj.IsNil())
{
metaTableObj = pLuaState->GetGlobals().CreateTable("RandomMove");
}
metaTableObj.SetObject("__index", metaTableObj);
metaTableObj.RegisterObjectDirect("GetX", (TestLua*)0, &TestLua::GetX);
metaTableObj.RegisterObjectDirect("SetX", (TestLua*)0, &TestLua::SetX);

TestLua obj1(6);
LuaObject table1Obj = pLuaState->GetGlobals().CreateTable("table1");
table1Obj.SetLightUserData("__object", &obj1);
table1Obj.SetObject("__index", metaTableObj);
table1Obj.SetMetaTable(metaTableObj);
pLuaState->DoString("table1:prints()");

auto prints = table1Obj.GetByName("prints");
if (!prints.IsFunction())
cout << "nil function" << endl;
else
{
LuaPlus::LuaFunction<void> func(prints);
func();
}

test.lua

print("test.lua")

RandomMove =
{
_thing = 1
}

function RandomMove:SetThing()
print("I am "..tostring(self.__object))
end

function RandomMove:prints()
print("in prints")
print("__object is: " .. tostring(self.__object))
print("_thing is: ".. tostring(self._thing))
print(self:GetX())
end

Любая помощь будет оценена.

1

Решение

Ты прав. Функции ничего не знают о своих «родителях», своих «объектах» или о чем-либо еще. Вот почему : синтаксис вызова существует. Вызов table1:prints() идентично table1.prints(table1) (только Луа гарантирует, что table1 оценивается только один раз.

Так что, если вы возьмете функцию из таблицы / и т.д. непосредственно, когда вы вызываете его напрямую, вам нужно убедиться, что вы передали правильную таблицу / и т.д. в качестве первого аргумента (перед любыми другими аргументами, которые ожидает функция).

2

Другие решения


По вопросам рекламы [email protected]