如果我的表格看起来像table1 = {x = 0, y = 0}
而另一张表格看起来像table2 = {x = 0, y = 2}
我希望能够像这样添加它们
table1 += table2 --table1 now == {x = 0, y = 2}
等效的c ++代码如下所示:
typedef struct {int x; int y;} S;
S s1 = {0, 0};
S s2 = {0, 2};
int add(S ls1, S ls2)
{
s1.x = s1.x + s2.x;
s1.y = s1.y + s2.y;
return s1.x;
}
int main() {
add(s1, s2);
std::cout << s1.x << " " << s1.y;
}
甚至更好
#include <iostream>
typedef struct {int x; int y;} S;
S s1 = {0, 0};
S s2 = {0, 2};
int operator+=(S ls1, S ls2)
{
s1.x = s1.x + s2.x;
s1.y = s1.y + s2.y;
return s1.x;
}
int main() {
s1 += s2;
std::cout << s1.x << " " << s1.y;
}
答案 0 :(得分:3)
只是迭代......
function add(t1,t2)
local new = {}
for i,v in pairs(t1) do
if type(v) == "number" and type(t2[i]) == "number" then
new[i] = v + t2[i]
else
new[i] = v
end
end
return new
end
答案 1 :(得分:3)
这里有两个选项:
只需实现像warspyking建议的添加功能。
或
实现相同的功能并将其设置为表格&#39; __add metamethod类似于Digital Veer所建议的。虽然为了方便我会在这里定义一个对象,但只按你希望的方式添加2个组件x和y。否则,您每次都必须手动为两个表设置元表。
Point = {}
function Point:New(x,y)
local o = {}
setmetatable(o, self)
self.__index = self
self.__add = function (p1,p2) return Point:New(p1.x + p2.x, p1.y + p2.y) end
o.x = type(x) == "number" and x or 0
o.y = type(y) == "number" and y or 0
return o
end
然后你可以做类似的事情:
local a = Point:New(1,1)
local b = Point:New(2,2)
local c = a + b
答案 2 :(得分:1)
如果您确保两个表都具有相同的索引键,那么您只需使用_add
元方法来实现此目的:
local table1 = {x=0, y=2, z=3}
local table2 = {x=0,y=5}
local meta = {
__add = function(t1, t2)
local new = {}
for i,v in pairs(t1) do
if t2[i] then
new[i] = t1[i] + t2[i]
end
end
return new
end
}
setmetatable(table1,meta)
setmetatable(table2,meta)
for k, v in pairs(table1 + table2) do
print(k, v)
end
答案 3 :(得分:1)
Lua没有正式的班级系统。您可以通过metatable系统共享代码,其中包括__index
,__tostring
和__add
。
您要求提供运营商+=
。 Lua有一组固定的运营商。虽然,您可以为表定义它们,但不能创建新的表。所以,+=
已经出局了。作为@Piglet shows,您可以使用+
元方法定义_add
。当然,+
不会修改左操作数。虽然这可能会更好,但这不是你建模的。
更类似于你建模的方法(但我将方法称为“offset”,参数“delta”)如下所示:
local S = {}
S.__index = S -- expose members of S to tables created by S:New
function S:New(x,y)
return setmetatable({ x=x, y=y }, self)
end
function S:__tostring()
return tostring(self.x) .. " " .. tostring(self.y)
end
function S:Offset(delta)
self.x = self.x + delta.x
self.y = self.y + delta.y
return self
end
-- Example…
local s1 = S:New(0,0)
local s2 = S:New(1,2)
print(s1:Offset(s2))
print(s1)