0

我想在 lua 中创建一个具有定义函数的代理类。所以,如果我有一个soldier.lua像这样的 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 函数 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

使用解决:

  • Agent在 lua 文件执行后设置元表
  • 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 回答