0

luaで定義された関数を使用してAgentクラスを作成したいと思います。したがって、次のようなluaファイルがある場合soldier.lua

function Agent:init()
   io.write("Agent init\n")
   if self then
      self.x = 4
      self:test()
   end
end

function Agent:test()
   io.write("Agent test\n")
end

Cコードからロードして、次のようなAgentテーブルを作成できます。

// create Agent class on Lua
lua_newtable( L );
lua_setfield(L, LUA_GLOBALSINDEX, "Agent");
// execute class file
auto ret = luaL_dofile( L, filename.c_str() );

selfここで、Cから偽のオブジェクトを作成して呼び出しAgent:init、a)self.x行でC関数を呼び出してデータを登録します。そして、行self.test()は、lua funcion Agent:testを正しく呼び出します。しかし、私はそれを機能させることができません。

例えば:

lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
lua_getfield( L, -1, "init");
lua_newtable( L );
lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
lua_setmetatable( L, -2 );
lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
lua_getmetatable( L, -1 );
lua_pushcfunction( L, testnewindex );
lua_setfield( L, -2, "__newindex" );
ret = lua_pcall( L, 1, 0, 0 );

何か案は?

4

1 に答える 1

1

使用して解決:

  • Agentluaファイルの実行後にメタテーブルをオンに設定
  • Agentファイル関数を呼び出すときに独自の偽のオブジェクトとして使用する:

私の呼び出しの後lua_dofile(...)

lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
luaL_newmetatable( L, "Agent" );
lua_pushstring(L, "__newindex");
lua_pushcfunction( L, agent_newindex );
lua_settable( L, -3 );
lua_pushstring(L, "__index");
lua_pushcfunction( L, agent_index );
lua_settable( L, -3 );
lua_setmetatable( L, -2 );

次に、関数の呼び出しは次のようにAgent:init実行されます。

lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
lua_getfield( L, -1, "init");
lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
ret = lua_pcall( L, 1, 0, 0 );
于 2013-02-21T16:02:37.450 に答える