一連のテーブルに比較的深くネストされた関数があります。C / C ++で、その関数への「参照」を取得し、それを使用する必要があるときにそれ(および引数)をスタックにプッシュする方法はありますか?
2 に答える
これがリファレンスシステムの目的です。関数呼び出し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_gettable()よりもlua_rawget()の方が適している場合があります)
コメントに応じて追加:
さて、それはもう少し面白いです。ええと、テーブルは(多かれ少なかれ)参照オブジェクトなので、最も内側のテーブル参照をどこかに保存するのがおそらく安全でしょう。
lua APIにはテーブル参照を直接操作する機能がないように思われるため、おそらく参照をグローバルにプッシュする必要があります。それが機能しない場合は、単一のテーブルエントリを持つ新しいテーブルが機能します。後で参照が必要な場合は、グローバルから取得してください。
例えば
// Final table reference is now at top of stack, after multiple dereferences
lua_setglobal( L, "mytableref" );