简体   繁体   中英

Binding a Lua table function to a C++ variable using LUAPlus

I want to link a Lua table function to a C++ variable using LUAPlus. So far using what information I can find on the web, I've managed to call a table function using DoString("tableName:functionName") , but I want to be able to call the function through a variable. I know its possible but I cant figure out what I'm doing wrong.

In the code I've added, pLuaState->DoString("table1:prints()") works fine and prints everything as needed. When I try to get the function and call it using the func variable, my program crashes with

error message

Assertion failed: 0, file .../luafunciton.h, line 41

If I remove all the prints in the prints() function in Lua except "print("in prints")", everything works fine. Based on this I assume that GetByName("functionName") returns a function that doesn't contain a reference to its parent table. And this is where I get stuck.

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

Any help would be appreciated.

You are correct. Functions do not know anything about their "parents" or their "objects" or anything. That's why the : calling syntax exists. The call table1:prints() is identical to table1.prints(table1) (only lua ensures that table1 is evaluated only once.

So if you grab the function from the table/etc. directly when you call it directly you need to ensure that you pass the correct table/etc. as the first argument (before any other arguments the function expects).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM