Lua 添加两个表

Lua add two tables

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

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

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

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

您可以定义一个方法来 return table 的并集:

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

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

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

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