Lua 添加两个表
Lua add two tables
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')
...
您可以将对表求和的函数设置为元表中的 __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)
在此之后 a
和 c
都包含 {"a, "b", "c", "d", "e"}
,而 b
仍然是 {"c", "d", "e"}
。
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')
...
您可以将对表求和的函数设置为元表中的 __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)
在此之后 a
和 c
都包含 {"a, "b", "c", "d", "e"}
,而 b
仍然是 {"c", "d", "e"}
。