如何在Lua中注册来自C的函数时将模块嵌套到命名空间中?

我正在尝试“嵌套”来自C的两个模块。我想要适当地分离它们。

这是我的“Core”模块。它有一个名为“setName”的方法:

int l_setName(lua_State *l)
{
    // 做某事
    return 0;
}

///////////////////////////////////////////////////////////////////////////////

static luaL_Reg const core_funcs [] =
{
    { "setName",            l_setName },
    { NULL, NULL }
};

///////////////////////////////////////////////////////////////////////////////

void l_registerFuncs( lua_State * L )
{
    luaL_newlib(L, core_funcs);
    lua_setglobal(L, "Core");
}

///////////////////////////////////////////////////////////////////////////////

从Lua中,您可以说“Core.setName(“hello world”)”

这是一个包含20个函数的复杂子系统,所有函数都与同一领域有关。

int l_importantFunction(lua_State *l)
{
    // 做某事
    return 0;
}

///////////////////////////////////////////////////////////////////////////////

static luaL_Reg const subSystem_funcs [] =
{
    { "importantFunction",          l_importantFunction },
    { NULL, NULL }
};

///////////////////////////////////////////////////////////////////////////////

void l_registerFuncs( lua_State * L )
{
    luaL_newlib(L, subSystem_funcs);
    lua_setglobal(L, "Core.Subsystem");
}

///////////////////////////////////////////////////////////////////////////////

我希望将此子系统注册到Core下。我想能够说“Core.Subsystem.importantFunction(“ Hi”)”

然而,这样做不起作用。

什么是惯用的lua方式来做到这一点?

在查看人们如何注册“对象”后,似乎这个可能会变得非常复杂

点赞
用户258523
用户258523

你需要手动获取Core表,然后使用lua_setfield(或类似的函数)在该表中创建Subsystem条目。

如下所示,按照010110110101的指示进行操作:

lua_getglobal(L, "Core");
luaL_newlib(L, subSystem_funcs);
lua_setfield(L, -2, "SubSystem");
2014-05-23 14:02:22