2009-09-13 13 views
13

私は、テーブルのセットに比較的深くネストされた関数を持っています。 C/C++でその関数への "参照"を取得し、それを使用する必要があるときにスタックにその(とargs)をプッシュする方法はありますか?C/C++でのLua関数への参照

答えて

20

これはreference systemの対象です。関数呼び出しr = luaL_ref(L, LUA_REGISTRYINDEX)は、スタックの先頭の値をレジストリに格納し、C側に格納できる整数を返し、関数呼び出しlua_rawgeti(L, LUA_REGISTRYINDEX, r)で値を取得するために使用します。

PiL chapterと、全文はluaL_ref(),lua_rawgeti()luaL_unref()のドキュメントを参照してください。

2

Lua API(http://www.lua.org/manual/5.1/manual.html#3)を使用すると、必要なテーブルメンバーにアクセスできます。 lua_gettable()を使用してテーブルメンバーを抽出し、luaスタックに置いてください。メンバーがテーブルでもあれば、lua_gettable()を呼び出してこのテーブルにアクセスしてください。 「はコメントに反応して

addtionalの))(lua_gettableよりも良い選択かもしれません)(lua_rawgetをやっ再:

オーケーそれはもう少し面白いです。さて、テーブルは参照オブジェクトです(多かれ少なかれ)ので、最も内側のテーブル参照をどこかに保存するのはおそらく安全でしょう。

テーブル参照を直接操作するためのAPIがないため、参照をグローバルにプッシュする必要があります。または、単一のテーブルエントリで新しいテーブルを操作できない場合があります。後で参照をしたいときは、グローバルから取得してください。

// Final table reference is now at top of stack, after multiple dereferences 
lua_setglobal(L, "mytableref"); 
+0

私はすでにそれを行う方法を知っています:)テーブル内のネストされた方法で参照される関数を取得したいので、後ですべてのテーブルをトラバースせずに関数を呼び出すことができます。 – jameszhao00

+0

[回答に追加] –

関連する問題