C / C ++のLua関数への参照
-
06-07-2019 - |
質問
テーブルのセットに比較的深くネストされた関数があります。 C / C ++に「参照」を取得する方法はありますか?その関数に追加し、使用する必要があるときにそれをスタックにプッシュしますか?
解決
これは、参照システムの目的です。関数呼び出し r = luaL_ref(L、LUA_REGISTRYINDEX)
は、レジストリのスタックの一番上に値を保存し、C側に保存して値を取得するために使用できる整数を返します関数呼び出し lua_rawgeti(L、LUA_REGISTRYINDEX、r)
。
PiLの章と、 luaL_ref()
、 lua_rawgeti()
、および luaL_unref()
をご覧ください。
他のヒント
Lua API( http://www.lua.org/manual /5.1/manual.html#3 )を使用して、必要なテーブルメンバーにアクセスできます。 lua_gettable()を使用してテーブルメンバーを抽出し、luaスタックに配置します。メンバーもテーブルである場合は、lua_gettable()を再度呼び出してこのテーブルにアクセスするだけです...
(lua_rawtable()よりもlua_rawget()の方が良い選択かもしれません)
コメントへの応答で追加:
さて、それはもう少し面白いです。さて、テーブルは(多かれ少なかれ)参照オブジェクトなので、おそらく最も内側のテーブル参照をどこかに保存しても安全でしょう。
lua APIにはテーブル参照を直接操作する手段がないため、参照をグローバルにプッシュする必要があるか、単一のテーブルエントリを持つ新しいテーブルが機能しない場合があります。後で参照が必要な場合は、グローバルから取得します。
e.g。
// Final table reference is now at top of stack, after multiple dereferences
lua_setglobal( L, "mytableref" );