从C代码在Lua中创建对象
我想用lua中定义的函数创建一个代理类。所以,如果我有一个lua文件从C代码在Lua中创建对象,lua,Lua,我想用lua中定义的函数创建一个代理类。所以,如果我有一个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代码中,我可以加载它,创建代理表,如下所示: // creat
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函数代理:test。但我不能让它工作
例如:
有什么想法吗?使用以下方法解决:
- 执行lua文件后,在代理上设置元表
- 调用文件函数时,使用
作为自己的伪对象:Agent
lua\u 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 );
“但我可以让它工作”那有什么问题吗@BartekBanachewicz傻我,修正:)。问题与答案
lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
lua_getfield( L, -1, "init");
lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
ret = lua_pcall( L, 1, 0, 0 );