我想使用LUAPlus将Lua表函数链接到C ++变量。到目前为止,使用我在网络上可以找到的信息,我已经设法使用DoString("tableName:functionName")
调用表函数,但我希望能够通过变量调用该函数。我知道它可能,但我无法弄清楚我做错了什么。
在我添加的代码中,pLuaState->DoString("table1:prints()")
工作正常并根据需要打印所有内容。
当我尝试获取该函数并使用func变量调用它时,我的程序崩溃了
错误消息
断言失败:0,文件... / luafunciton.h,第41行
如果我删除了Lua中的prints()函数中的所有打印件,除了" print("在print")",一切正常。基于此,我假设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
任何帮助都将不胜感激。
答案 0 :(得分:2)
你是对的。功能对他们的父母&#34;没有任何了解。或他们的&#34;对象&#34;什么的这就是:
调用语法存在的原因。致电table1:prints()
与table1.prints(table1)
相同(只有lua确保仅table1
评估一次。
所以如果从表/ etc中获取函数。直接调用它时,你需要确保传递正确的表/ etc。作为第一个参数(在函数期望的任何其他参数之前)。