我有以下代码:
lua_State *lua;
lua = lua_open();
luaL_openlibs(lua);
std::string code = "print(gvar)\n"
"function test()\n"
"print(gvar)\n"
"end\n";
if(!luaL_loadstring(lua, code.c_str())){
if (lua_pcall(lua, 0, 0, 0)){
const char* error = lua_tostring(lua, -1);
lua_pop(lua, 1);
}
}
lua_pushstring(lua, "100");
lua_setglobal(lua, "gvar");
if (lua_pcall(lua, 0, 0, 0)){
const char* error = lua_tostring(lua, -1); // returns "attempt to call a nil value"
lua_pop(lua, 1);
}
lua_close(lua);
调用函数和获取全局变量工作正常,但是当我尝试设置全局变量时,我会“尝试调用nil值”。我不明白为什么会这样?
答案 0 :(得分:2)
if(!luaL_loadstring(lua, code.c_str())){
if (lua_pcall(lua, 0, 0, 0)){
const char* error = lua_tostring(lua, -1);
lua_pop(lua, 1);
}
}
此代码使用luaL_loadstring()
将字符串加载到匿名函数中,将其放在堆栈上,然后使用lua_pcall(lua, 0, 0, 0)
执行该函数。
lua_pushstring(lua, "100");
lua_setglobal(lua, "gvar");
if (lua_pcall(lua, 0, 0, 0)){
const char* error = lua_tostring(lua, -1); // returns "attempt to call a nil value"
lua_pop(lua, 1);
}
这段代码将字符串压入堆栈,然后设置全局变量gvar
。调用lua_setglobal()
后,堆栈中应该没有任何内容。 var已经存在。
此后,您尝试使用lua_pcall
调用位于堆栈顶部的函数,但堆栈为空 - 这就是您收到attempt to call a nil value
消息的原因。