【问题标题】:Binding a Lua table function to a C++ variable using LUAPlus使用 LUAPlus 将 Lua 表函数绑定到 C++ 变量
【发布时间】:2015-04-23 11:11:28
【问题描述】:

我想使用 LUAPlus 将 Lua 表函数链接到 C++ 变量。到目前为止,使用我可以在网上找到的信息,我已经设法使用DoString("tableName:functionName") 调用表函数,但我希望能够通过变量调用该函数。我知道它可能,但我不知道我做错了什么。

在我添加的代码中,pLuaState->DoString("table1:prints()") 可以正常工作并根据需要打印所有内容。 当我尝试获取函数并使用 func 变量调用它时,我的程序因

而崩溃

错误信息

断言失败:0,文件 .../luafunciton.h,第 41 行

如果我删除 Lua 中 prints() 函数中的所有打印,除了 "print("in prints")",一切正常。基于此,我假设GetByName("functionName") 返回的函数不包含对其父表的引用。这就是我卡住的地方。

ma​​in.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

任何帮助将不胜感激。

【问题讨论】:

    标签: c++ lua luaplus


    【解决方案1】:

    你是对的。函数对它们的“父母”或“对象”或任何东西一无所知。这就是存在: 调用语法的原因。调用 table1:prints()table1.prints(table1) 相同(只有 lua 确保 table1 只被评估一次。

    所以如果你从表/等中获取函数。直接调用时,您需要确保传递正确的表/等。作为第一个参数(在函数期望的任何其他参数之前)。

    【讨论】:

    • 谢谢!所以它有点像 C++ 中的“this”参数。
    • “自动”参数非常像this,是的。 lua 使用 self 作为 lua 代码中的变量名,用于这样的函数。
    猜你喜欢
    • 2013-02-08
    • 2021-05-19
    • 2014-11-10
    • 2011-08-15
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    相关资源
    最近更新 更多