Lua PCall在我想从C中调用表时是否可以调用__call元函数

我正在尝试使用C API和Lua5.1调用一个表。

我按照以下步骤进行操作:

  1. 创建一个具有__call元函数的表“mt”
  2. 创建一个表“newT”并将“mt”设置为“newT”元表
  3. pcall“newT”

我的问题出在第3步,我得到错误:**"attempt to call a table value"**

有没有人告诉我如何在C中调用表?

点赞
用户1836540
用户1836540

Lua

t = {}
setmetatable(t, { __call = function() print("calling the table") end })
pcall(t)

对应的 C 代码(未经过测试,但应该可行)

int mtcall(lua_State* L) {
    printf("calling the table\n");
    return 0;
}

int mainchunk(lua_State* L) {
    lua_newtable(L);                    // stack : t
    lua_newtable(L);                    // stack : t, mt
    lua_pushcfunction(L, &mtcall);      // stack : t, mt, &mtcall
    lua_setfield(L, -2, "__call");      // mt.__call = &mtcall || stack : t, mt
    lua_setmetatable(L, -2);            // setmetatable(t, mt) || stack : t
    if (lua_pcall(L, 1, 0) != 0)        // 如果有错误,堆栈上会有一个错误字符串。弹出它。
        lua_pop(L, 1);
    return 0;
}
2016-10-23 00:58:20