Lua:加载第二个字符串后无法获取字段;

下午好, 我正在工作一款LUA/C++应用程序,其中我需要LUA能够递归调用其他的lua代码,例如:C++调用lua函数,lua函数调用通过在第一个lua函数开始时运行的已注册C函数加载的来自另一个字符串的其他lua函数;

以下是我正在跟随的步骤:

    lua_State* state = luaL_newstate();
    luaL_openlibs(state);
    lua_register(state, "secondLua", secondLua);
    lua_getfield( _luaState, LUA_GLOBALSINDEX, "init" );
    lua_pcall( _luaState, 0, 0, 0 );

    int secondLua(lua_State* state){
    char* myString[128] = "function init2()\n io.write(\"hello\")\n end";
    luaL_loadstring(pLuaState, myString);
    lua_getfield(pLuaState,LUA_GLOBALSINDEX, "init2"); // function init2 declared on myString
    lua_pcall(pLuaState, 0, LUA_MULTRET, 0);
//getting "attempt to call a nil value" here

    return 0;
    }

任何帮助将不胜感激,我还想知道是否有办法将第二个函数也命名为“init”和第一个函数一样;

PS:我正在使用C++14和lua 5.1在LUAJIT上,并且我无法使用lua的dofile;

点赞
用户5675002
用户5675002

lua_loadstring() 函数编译提供的源代码并将 Lua 代码块放入栈中。但它不会立即执行该代码块,因此当您需要时 init2() 仍未定义。

可使用 luaL_dostring() 函数替换 lua_loadstring() 来实际运行该代码块并定义新的 Lua 函数。或是在 lua_loadstring() 后调用 lua_pcall()。实际上,luaL_dostring() 正是执行了 lua_loadstring() 后紧接着执行了 lua_pcall()

2016-03-18 22:58:19