13

一連のテーブルに比較的深くネストされた関数があります。C / C ++で、その関数への「参照」を取得し、それを使用する必要があるときにそれ(および引数)をスタックにプッシュする方法はありますか?

4

2 に答える 2

21

これがリファレンスシステムの目的です。関数呼び出しr = luaL_ref(L, LUA_REGISTRYINDEX)は、レジストリのスタックの最上位に値を格納し、C側に格納して、関数呼び出しで値を取得するために使用できる整数を返しますlua_rawgeti(L, LUA_REGISTRYINDEX, r)

詳細については、PiLの章、およびluaL_ref()、、のドキュメントを参照してください。lua_rawgeti()luaL_unref()

于 2009-09-13T19:26:04.280 に答える
2

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" );
于 2009-09-13T08:02:58.403 に答える