Lua <5.2用に作成されたライブラリを採用していて、次のようなものがわからないという電話を受けました。
_luaL_openlib(L, "Polycore", polycoreLib, 0);
_
ここで、polycoreLib
は
_static const struct luaL_Reg polycoreLib []
_
_luaL_openlib
_への呼び出しを置き換えるにはどうすればよいですか?
Lua wikiのみ states :
luaL_openlib(L, name, lreg, x);
などの呼び出しは、指定された名前のグローバルテーブルが検索され、場合によっては作成されるため、慎重に書き直す必要があります。
これには2つの答えがあります。1つはここで以前のバージョンの動作を複製するため(グローバルテーブルが作成される)、もう1つは現在の動作を実装するため(匿名テーブルを作成して返す)です。
前者の場合:
lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
lua_setglobal(L, "Polycore");
これはquiteluaL_openlib
と同じではありません。これは、既存のグローバルテーブルPolycore
がある場合、それとマージするのではなく上書きするためです。マージが問題になる場合は、最初にlua_getglobal
を使用し、次にテーブルをプッシュした場合は、新しいテーブルを作成するのではなく、それを再利用します。
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");
マージについて気にする必要がないため、後者の方が簡単です。
lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
return 1;
このアプローチでは、次のように、テーブルをバインドするのは呼び出し元の責任です。
local Polycore = require "Polycore"