web-dev-qa-db-ja.com

Lua5.2のluaL_openlibの置き換え

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);などの呼び出しは、指定された名前のグローバルテーブルが検索され、場合によっては作成されるため、慎重に書き直す必要があります。

22
Appleshell

これには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"
31
ToxicFrog