Lua C API中的register fallback __index。

我想知道如何在 Lua C API 中编写类似于来自 http://lua-users.org/wiki/MetamethodsTutorial 的 Lua 代码段。

例如,我希望 Lua 首先检查成员的元表中是否存在键,否则调用 __index 实现。我已经想到了以下代码:

static const struct luaL_reg
lobj_fallback[] = {
    {"__index", lobject_index},
    {"__newindex", lobject_newindex},
    {"__tostring", lobject_tostring},
    {NULL, NULL},
};

static const struct luaL_reg
lobj_members[] = {
    {"delete", lobject_delete},
    {NULL, NULL}
};

{
    // 代码省略...
    luaL_newmetatable(L,  "MyMetaTable");
    luaL_register(L, NULL, lobj_members);

    luaL_newmetatable(L, "MyMetaTableFallback");
    luaL_register(L, NULL, lobj_fallback);

    lua_setmetatable(L, -2);
    // 代码省略...
}

然而,这并不像预期的那样工作:回退的 __index 实现可以正常运行,但成员元表不行("attempt to call method 'delete' (a nil value)")。

点赞
用户1161045
用户1161045

如果你的意图是在访问"MyMetaTable"时回退到索引函数,那么你已经交换了你的表格和元表的名称。因此,成员表(lobj_members)被称为"MyMetaTableFallback",而元表(lobj_fallback)被称为"MyMetaTable"。

2013-09-23 12:06:23