我想在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代码中,我可以加载它,创建代理表,如:
// 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() );
现在我想从C创建一个假对象self
来调用Agent:init
和a)self.x行调用一个C函数来注册数据。并且self.test()行正确调用了lua函数Agent:test。但我无法让它发挥作用。
E.g:
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 );
有什么想法吗?
答案 0 :(得分:1)
解决使用:
Agent
上设置metatable 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 );