将多维 lua 数组从 lua_State 转移到 lua_State C++

我有两个脚本,它们分别在不同的 lua_State 中。

我想要能够从一个状态获取一个变量,并在另一个状态中使用它。

我的下面的代码适用于单个变量和单向数组。我能不能得到一些指导,让它也适用于多维数组?

void getValues(lua_State* L1, lua_State* L2, int& returns)
{
    if (lua_isuserdata(L1, -1))
    {
        LuaElement* e = Luna<LuaElement>::to_object(L1, -1);
        if (e != NULL)
        {
            Luna<LuaElement>::push_object(L2, e);
        }
    }
    else if (lua_isstring(L1, -1))
    {
        lua_pushstring(L2, lua_tostring(L1, -1));
    }
    else if (lua_isnumber(L1, -1))
        lua_pushnumber(L2, lua_tonumber(L1, -1));
    else if (lua_isboolean(L1, -1))
        lua_pushboolean(L2, lua_toboolean(L1, -1));
    else if (lua_istable(L1, -1))
    {
        lua_pushnil(L1);
        lua_newtable(L2);
        while (lua_next(L1, -2))
        {
            getValues(L1, L2, returns);

            lua_rawseti(L2,-2,returns-1);
            lua_pop(L1, 1);
        }
        // lua_rawseti(L2,-2,returns); // 这需要工作
    }
    returns++;
}

不幸的是,我在让递归正确工作以适用于多维数组方面遇到了困难。

点赞
用户7556173
用户7556173

你可以尝试 lua_tinker::table:

2017-09-14 06:36:41
用户8150130
用户8150130

以下是翻译:

对于任何人可能有用的代码:

void getValues(lua_State* L1, lua_State* L2, int ind)
{
    if (lua_type(L1, -1) == LUA_TTABLE)
    {
        lua_newtable(L2);
        lua_pushnil(L1);
        ind = 0;
        while (lua_next(L1, -2))
        {
            // 压入键
            if (lua_type(L1, -2) == LUA_TSTRING)
                lua_pushstring(L2, lua_tostring(L1, -2));
            else if (lua_type(L1, -2) == LUA_TNUMBER)
                lua_pushnumber(L2, lua_tonumber(L1, -2));
            else
                lua_pushnumber(L2, ind);

            getValues(L1, L2, ind++);
            lua_pop(L1, 1);

            lua_settable(L2, -3);
        }
    }
    else if (lua_type(L1, -1) == LUA_TSTRING)
    {
        lua_pushstring(L2, lua_tostring(L1, -1));
    }
    else if (lua_type(L1, -1) == LUA_TNUMBER)
    {
        lua_pushnumber(L2, lua_tonumber(L1, -1));
    }
    else if (lua_type(L1, -1) == LUA_TBOOLEAN)
    {
        lua_pushboolean(L2, lua_toboolean(L1, -1));
    }
    else if (lua_type(L1, -1) == LUA_TUSERDATA)
    {
        // 更换为您自己的用户数据. 这是我的
        LuaElement* e = Luna<LuaElement>::to_object(L1, -1);
        if (e != NULL)
        {
            Luna<LuaElement>::push_object(L2, e);
        }
    }
}

注意: L1和L2必须是不同的状态。

2017-09-14 23:05:27