我正在尝试创建一个从 lua 检查时具有 2 个上值的函数。debug.getinfo(fvalues).nups 应该是 2 。
static int fvalues (lua_State *L) {
int n = lua_gettop(L);
if (str.size() == 0) {
str = "This_is_a_test";
}
const char *cstr = str.c_str();
lua_pushstring(L, cstr);
lua_pushcclosure(L, &fvalues, 1);
lua_pushstring(L, cstr);
lua_pushcclosure(L, &fvalues, 2);
lua_pushstring(L, cstr);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,pushclosure 不应该创造升值,我不太明白这应该如何工作。
不是很清楚你要做什么。如果你想fvalues用 2 个上值推送 C 闭包,那么:
int
main(int argc, char *argv[])
{
...
lua_pushstring(L, "Hello, World!");
lua_pushnumber(L, 3.14);
lua_pushcclosure(L, fvalues, 2);
lua_setglobal(L, "fvalues");
...
}
static int
fvalues(lua_State *L)
{
printf("%s\n", lua_tostring(L, lua_upvalueindex(1)); // Hello, World!
printf("%g\n", lua_tonumber(L, lua_upvalueindex(2)); // 3.14
return 0;
}
Run Code Online (Sandbox Code Playgroud)
闭包是通过将lua_CFunction堆栈顶部的值传递给 来创建的lua_pushcclosure。该函数的主体与上值的创建无关,它只能通过lua_upvalueindex(n).