在lua中添加表

时间:2016-03-26 01:57:54

标签: lua lua-table

如果我的表格看起来像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;
}

4 个答案:

答案 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)