Lua添加了两个表

时间:2017-04-17 21:45:46

标签: lua lua-table

x = {1, 2, 3}
y = {4, 5, 6}
z = x + y

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

5 个答案:

答案 0 :(得分:4)

似乎您想要连接两个表以获取{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元方法更适合你的意思。)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以定义一个返回表的并集的方法:

-8

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

答案 3 :(得分:1)

正如其他答案所提到的那样,没有内置的方法可以做到这一点。最简单的方法是定义自己的功能,就像在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

答案 4 :(得分:0)

您也可以使用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"}