2014-11-10 6 views
4

테이블에 더 많은 사용법을 추가하는 Array 클래스를 만들고 있습니다. 나는 나 두 테이블을 결합 할 수있는 메타 메소드, 전이 : 나는 알고 있어요 당신에게 {5, 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

이 표준 루아 동작입니다 : 여기 내 코드와 출력은 쉼표로 구분 된 함수 호출의 열거에, 마지막 하나는 여러 개의 결과를 반환 할 수 있습니다. 예를 들어 : 내가 당신이라면

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

나는 간단한 일을하고 for 루프를 사용합니다.

+0

'... '의 확장에도 적용됩니다. 일반적인 규칙입니다. –