2014-07-12 4 views
1

나는 다음과 같은 테이블 세트 가지고 : 당신이 볼 수 있듯이테이블을 반복하여 순서를 유지하는 방법은 무엇입니까?

for seconds, str in pairs(a) do 
    print (seconds, str) 
end 
---------- 
31104000 year 
60   minute 
3600  hour 
1   second 
2592000  month 
86400  day 

, 순서가 완전히 엉망 : 나는 그것을 인쇄 키를 통해 루프를 쌍을 때

local a = { 
    [12 * 30 * 24 * 60 * 60] = 'year', 
    [30 * 24 * 60 * 60]  = 'month', 
    [24 * 60 * 60]   = 'day', 
    [60 * 60]     = 'hour', 
    [60]      = 'minute', 
    [1]      = 'second' 
} 

를, 값 나는이 얻을 쪽으로. 테이블을 반복하여 순서를 유지할 수 있습니까?
루아 테이블이 명시 적 요소가 입력 된 순서를 보존하지 않기 때문에 사후 순서를 참조하는 방법은 지금있다 :

답변

3

하기는 오해에서 수고하고 있습니다.
(현재는 배열과 해시 맵의 하이브리드입니다.)

실제로 원하는 것 (제공된 예제를 따르는 것)은 키순으로 정렬 된 요소를 반복합니다.
확실히 가능하지만 맞춤 iterator가 필요합니다.

는 반복자는 작동 방식 :
what is actual implementation of lua __pairs?
Difference between stateful and stateless iterators in Lua

function sorted_iter(t) 
    local i = {} 
    for k in next, t do 
    table.insert(i, k) 
    end 
    table.sort(i) 
    return function() 
    local k = table.remove(i) 
    if k ~= nil then 
     return k, t[k] 
    end 
    end 
end 

따라서, 루프가된다 :

for seconds, str in sorted_iter(a) do 
    print (seconds, str) 
end 
3

당신이 직접 할 수 없습니다. 당신은뿐만 아니라 처음부터 할 수있는 다른 테이블 구조를 구축해야 할 것 : 당신이 어떤 요소를 추가하거나 삭제하지 않는 가정, 그리고

local a = { 
    { seconds = 12 * 30 * 24 * 60 * 60, name = 'year'}, 
    ... 
} 

을, 테이블의 배열 부분은 될 것 순서. 시퀀스의 경우 # 길이 연산자 또는 ipairs을 사용하여 반복 할 수 있습니다.