有些函數(shù)需要向lua返回多個(gè)結(jié)果,將這些結(jié)果存在table中是理所當(dāng)然的。因?yàn)閠oLua++已經(jīng)自動(dòng)生成了函數(shù)的wrapper,所以沒辦法直接將棧頂table返回給Lua。好在toLua預(yù)留了lua_Object這個(gè)類型,可以代表lua中的任何類型,其實(shí)它只是int的typedef罷了,主要是在toLua解析程序時(shí)作為標(biāo)記產(chǎn)生tolua_tovalue調(diào)用。在C/C++函數(shù)中,需要檢查一下棧頂是否為table類型,進(jìn)行table元素的插入操作,例子函數(shù)如下:
void ActorMgr::GetPlayerEntityIDs( lua_Object lua_table )
{
TEntityListIt tIt ;
std::list <int> result;
for(int i = 0; i < ACOTOR_BUCKET_LEN ; ++i)
{
for(tIt =mSceneEntities[i].mEntities.begin(); tIt != mSceneEntities[i].mEntities.end( ); ++tIt )
{
TActorPtr tpActor = tIt->second->mpActor ;
if(tpActor ->GetActorType() == LOCAL_PLAYER)
{
result.push_front(tpActor->GetEntityID());
}
else if (tpActor-> GetActorType() == REMOTE_PLAYER )
{
result.push_back(tpActor->GetEntityID());
}
}
}
lua_State* L = LuaVM::GetInstPtr()->mLS ;
assert(lua_istable (L , -1));
std::list <int>:: iterator iter = result. begin();
for(int i = 1; iter != result .end(); ++ iter , ++i )
{
lua_pushinteger(L , *iter);
lua_rawseti(L , -2 , i);
}
lua_pop(L , 1);
}
需要注意的是,如果是多個(gè)參數(shù),Lua的壓棧順序是object pointer、參數(shù)從左到右,所以棧頂元素是函數(shù)簽名最右邊的參數(shù)。