当我想从c调用一个表时,Lua PCall可以调用__call元函数

时间:2016-10-20 07:14:25

标签: lua metatable

我正在尝试使用c API和Lua5.1调用表。

我是通过以下步骤来完成的:

  1. 创建一个包含__call元函数
  2. 的表“mt”
  3. 创建一个表“newT”并将“mt”设置为“newT”metatable
  4. pcall“newT”
  5. 我的问题是在第3步,我收到错误:“尝试调用表值”

    有谁能告诉我如何在c中调用表?

1 个答案:

答案 0 :(得分:2)

的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)        // in case of error there will be an error string on the stack. Pop it out.
        lua_pop(L, 1);
    return 0;
}