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

时间:2014-05-23 13:21:41

标签: c lua

我试图"筑巢"从C.注册的两个模块我试图稍微分开一些问题。

这是我的"核心"模块。它有一个名为" setName"

的方法
int l_setName(lua_State *l)
{
    // do something
    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)
{
    // do something
    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")

然而,这不会起作用。

这样做的惯用方法是什么?

在查看人们如何注册"对象"之后,似乎是could get very complicated

1 个答案:

答案 0 :(得分:3)

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

随后是010110110101,上述指示成为:

lua_getglobal(L, "Core");
luaL_newlib(L, subSystem_funcs);
lua_setfield(L, -2, "SubSystem");