luaL_openlib replacement for Lua 5.2

后端 未结 1 1578
长发绾君心
长发绾君心 2020-12-29 23:56

I am adapting a library written for Lua < 5.2 and got to a call I don\'t know the equivalent of:

luaL_openlib(L, \"Polycore\", polycoreLib, 0);

相关标签:
1条回答
  • 2020-12-30 00:18

    There's two answers to this: one for replicating the behaviour of earlier versions here (where a global table is created), and one for implementing the behaviour that is now conventional (which is to create and return an anonymous table).

    For the former:

    lua_newtable(L);
    luaL_setfuncs(L, polycoreLib, 0);
    lua_setglobal(L, "Polycore");
    

    This isn't quite the same as luaL_openlib, because if there is an existing global table Polycore it will overwrite it rather than merging with it. If merging is a concern, use lua_getglobal first, then if it pushed a table re-use that rather than creating a new one:

    lua_getglobal(L, "Polycore");
    if (lua_isnil(L, -1)) {
      lua_pop(L, 1);
      lua_newtable(L);
    }
    luaL_setfuncs(L, polycoreLib, 0);
    lua_setglobal(L, "Polycore");
    

    The latter is easier because you don't need to care about merging:

    lua_newtable(L);
    luaL_setfuncs(L, polycoreLib, 0);
    return 1;
    

    With this approach, it is the caller's reponsibility to bind the table, as in:

    local Polycore = require "Polycore"
    
    0 讨论(0)
提交回复
热议问题