【问题标题】:Lua add two tablesLua添加两个表
【发布时间】:2017-09-13 13:58:37
【问题描述】:
x = {1, 2, 3}
y = {4, 5, 6}
z = x + y

我有两个表xy,只想创建第三个表,它只是它们两个的元素(未排序)。我努力使用上面的代码,但这给出了错误input:3: attempt to perform arithmetic on a table value (global 'x')...

【问题讨论】:

  • 如果x = { 1, 2, 3 }y = { 3, 4, 5 },应该z = x + y = { 1, 2, 3, 4, 5}(无重复)还是{ 1, 2, 3, 3, 4, 5 }(可能重复)?

标签: lua lua-table


【解决方案1】:

您似乎想连接两个表以获得{1, 2, 3, 4, 5, 6}

没有内置函数或运算符。您可以使用此代码:

z = {}
n = 0
for _,v in ipairs(x) do n=n+1; z[n]=v end
for _,v in ipairs(y) do n=n+1; z[n]=v end

如果您想使用语法z = x + y,则设置__add 元方法。 (但也许 __concat 元方法更适合您的意思。)

【讨论】:

    【解决方案2】:

    正如其他答案所提到的,没有内置的方法可以做到这一点。最简单的方法是定义自己的函数,如 GoojajiGreg 的回答。但是,如果你真的想使用+ 运算符,你可以使用__add 元方法。

    local metatable = {
        __add = function (t1, t2)
            local ret = {}
            for i, v in ipairs(t1) do
                table.insert(ret, v)
            end
            for i, v in ipairs(t2) do
                table.insert(ret, v)
            end
            return ret
        end
    }
    
    local x = {1, 2, 3}
    local y = {4, 5, 6}
    
    setmetatable(x, metatable)
    setmetatable(y, metatable)
    
    local z = x + y
    
    for i, v in ipairs(z) do
        print(v)
    end
    
    -- Output:
    -- 1
    -- 2
    -- 3
    -- 4
    -- 5
    -- 6
    

    【讨论】:

      【解决方案3】:

      您可以在元表中设置将表求和为__add 元方法的函数,该元表应该为需要该隐式行为的所有表设置。有关详细信息,请参阅 Lua 手册“元表和元方法”部分。

      【讨论】:

        【解决方案4】:

        您可以定义一个方法来返回表的联合:

        local function union ( a, b )
            local result = {}
            for k,v in pairs ( a ) do
                table.insert( result, v )
            end
            for k,v in pairs ( b ) do
                 table.insert( result, v )
            end
            return result
        end
        

        这不会阻止结果表中出现相同值的多个实例。

        【讨论】:

          【解决方案5】:

          你也可以使用table.move来做:

          function extend(t1, t2)
              return table.move(t2, 1, #t2, #t1 + 1, t1)
          end
          

          示例用法:

          a = {"a", "b"}
          b = {"c", "d", "e"}
          c = extend(a, b)
          

          在这之后ac 都包含{"a, "b", "c", "d", "e"},而b 仍然是{"c", "d", "e"}

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-03-09
            • 2014-09-22
            • 2021-12-20
            • 2021-12-16
            • 2013-02-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多