Lua添加两个表

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

我有两个表xy,只想创建一个第三个表,其中只包含它们两个的元素(不排序)。 我尝试使用上面的代码,但出现错误input: 3: attempt to perform arithmetic on a table value (global 'x') ...

点赞
用户5675002
用户5675002

你可以在需要隐式行为的所有表格中设置一个元表,将会将表格相加作为__add元方法的函数设置。详见Lua手册中的“元表和元方法”一章。

2017-04-17 21:51:19
用户107090
用户107090

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

2017-04-17 22:01:31
用户3455883
用户3455883

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

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

这个方法不能防止多个相同值的实例在结果表中出现。

2017-04-17 22:03:05
用户5287638
用户5287638

如其他答案所提到的,Lua 没有内建的方法来做到这一点。最简单的方法是像 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

-- 输出:
-- 1
-- 2
-- 3
-- 4
-- 5
-- 6
2017-04-27 12:06:04
用户640584
用户640584

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

2019-07-16 15:43:48