2014-11-10 6 views
4

Я создаю класс Array, который добавляет больше использования таблиц. У меня есть метаметод, что позволяет мне объединить две таблицы, напр:Как исправить эту проблему с распаковкой?

Array (5) .. Array (6, 10) должны дать вам {5, 6, 10}

Я знаю, что я может использовать две петли для этого, но я стараюсь сделать мой код максимально чистым и эффективным. Я столкнулся с проблемой с распаковкой. Я пытаюсь объединить две таблицы, но это не включает все значения. Вот мой код и вывод:

local Array = {} 
Array.__index = Array 

function Array.__concat(self, other) 
    return Array.new(unpack(self), unpack(other)) 
end 

function Array:concat(pattern) 
    return table.concat(self, pattern) 
end 

function Array.new(...) 
    return setmetatable({...}, Array) 
end 

setmetatable(Array, {__call = function(_, ...) return Array.new(...) end}) 

local x = Array(5, 12, 13) .. Array(6, 9) --concatenate two arrays 
print(x:concat(", ")) 

OUTPUT: 5, 6, 9 (I want it to be "5, 12, 13, 6, 9")

+0

Только маленький совет, 'table.concat' может принимать больше параметров. – hjpotter92

ответ

7

Это стандартное поведение Lua: в перечислении вызовов функций, разделенных запятыми, только последний может возвращать несколько результатов. Например:

> function f() return 1, 2, 3 end 
> print(f(), f()) 
1 1 2 3 

Если бы я тебя, я хотел бы сделать простую вещь и использовать for петлю.

+0

Применяется к расширению '...', что также делает его общим правилом. –

Смежные вопросы