x = {1, 2, 3}
y = {4, 5, 6}
z = x + y
我有两个表x
和y
,只想创建第三个表,它们只是两个表(未排序)。我努力使用上面的代码,但这会产生错误input:3: attempt to perform arithmetic on a table value (global 'x')
...
答案 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)
此后,a
和c
都包含{"a, "b", "c", "d", "e"}
,而b
仍为{"c", "d", "e"}
。