在Lua中注册一个闭包。

我想要使用自己的函数签名来简化导出过程,而不是使用 lua_CFunction 签名来编写从 Lua 调用的方法。

void foo(call_t *call)
{
    int a;
    char *b;
    char *c;
    table_t *d;

    /* 读取参数 */
    a = read_integer(call);
    b = read_string(call);

    /* 做一些事情... */

    /* 写入参数 */
    write_string(call, c);
    write_table(call, d);
}

/* 导出到 Lua */
export("foo", foo);

到目前为止,我想到的唯一方法是使用一个单独的 lua_CFunction 来调用来自表的包装函数。然而,我不知道如何将 Lua 函数与 C 函数和表索引关联起来,以有效地使 Lua 函数成为闭包。像这样:

lua_register_with_data(state, "foo", base_function, FOO_INDEX);

我应该如何实现这个?

点赞
用户1236574
用户1236574

我最终解决了它。我想这证明了小黄鸭调试是多么有用。

我只是将基本功能与实际功能索引一起注册为upvalue。

function_t table[FUNCTION_COUNT];

/* 使用 upvalue 查找函数 */
int base_function(lua_State *state)
{
    int index;
    call_t call;

    call.state = state;
    call.argument_index = 1;
    call.return_count = 0;

    index = lua_tointeger(state, lua_upvalueindex(1));
    table[index](&call);

    /* return_count 通过 write_* 函数递增 */
    return(call.return_count);

}

/* 作为闭包注册函数 */
table[FOO_INDEX] = foo;
lua_pushinteger(state, FOO_INDEX);
lua_pushcclosure(state, base_function, 1);
lua_setglobal(state, "foo");
2014-02-23 17:44:50