테이블 조작
테이블 조작 (Table Manipulation)
table 라이브러리는 테이블을 다루는 일반적인 함수들을 제공해요. 대부분의 함수는 배열(1부터 시작하는 정수 키로 구성된 리스트)을 전제로 해요. table 테이블의 함수는 table.이름(...)으로 호출해요.
table.concat
table.concat (list [, sep [, i [, j]]])
리스트 list의 요소들을 (각각 tostring으로) 문자열로 이어 붙인 문자열을 반환해요. sep로 요소 사이에 넣을 구분자(기본 없음)를, i와 j로 범위(기본 1부터 끝까지)를 지정할 수 있어요. list[i]부터 list[j]까지를 연결해요. sep는 문자열이거나 nil이어야 해요.
local t = { "a", "b", "c" }
print(table.concat(t)) --> abc
print(table.concat(t, "-")) --> a-b-c
print(table.concat(t, ",", 2, 3)) --> b,c
table.insert
table.insert (list, [pos,] value)
list에서 pos 위치(기본값은 끝 #list + 1)에 value를 삽입해요. pos가 주어지면 그 위치 이후의 요소들을 한 칸씩 뒤로 밀어요. list의 끝 또는 지정 위치에 추가해요.
local t = { 1, 2, 3 }
table.insert(t, 4) -- t = {1,2,3,4}
table.insert(t, 1, 0) -- t = {0,1,2,3,4}
table.move
table.move (a1, f, e, t [,a2])
테이블 a1의 f부터 e까지의 요소들을 테이블 a2(기본 a1)의 t 위치에서부터 이동/복사해요. 뒤에서부터 안전하게 복사해 겹쳐도 문제없어요. 결과 테이블을 반환해요.
table.pack
table.pack (...)
인자들을 새 테이블에 넣어 반환해요. 배열 부분(1, 2, ...)에 인자들이 채워지고, 실제 개수는 n 필드에 저장돼요. 가변 인자(...)를 테이블로 만들 때 유용해요.
local t = table.pack("a", "b", "c")
print(t.n) --> 3
table.remove
table.remove (list [, pos])
list의 pos 위치(기본값 #list)의 요소를 제거하고 그 값을 반환해요. 그 뒤의 요소들을 앞으로 당겨요. list가 비어 있으면 nil을 반환해요.
local t = { 1, 2, 3 }
local v = table.remove(t) -- v=3, t={1,2}
local v2 = table.remove(t, 1) -- v2=1, t={2}
table.sort
table.sort (list [, comp])
리스트 list의 요소들을 정렬해요. comp는 비교 함수로, comp(a, b)가 참이면 a가 b보다 앞으로 오게 해요. comp가 없으면 기본 순서(< 연산자에 따라)로 정렬해요. comp는 안정적이지 않을 수 있고, 순서가 정의되지 않는 case가 있으면 오류가 발생할 수 있어요. 정렬 중에는 리스트를 수정하면 안 돼요.
local t = { 3, 1, 2 }
table.sort(t) -- t = {1,2,3}
table.sort(t, function(a,b) return a > b end) -- 내림차순 {3,2,1}
table.unpack
table.unpack (list [, i [, j]])
리스트 list의 i(기본 1)부터 j(기본 #list)까지의 요소들을 반환해요. list의 요소들을 여러 값으로 풀어내는 데 써요. table.unpack은 다중 반환 위치(인자, return 등)에서 유용해요.
local t = { 10, 20, 30 }
local a, b, c = table.unpack(t)
print(a, b, c) --> 10 20 30
참고
table.insert, table.remove, table.concat 등은 리스트(연속 정수 키)를 대상으로 해요. 정수 키가 구멍(hole)이 있는 희소 테이블에서는 동작이 정의되지 않을 수 있으니, 연속된 배열로 유지하는 게 좋아요.
본문
배열과 테이블
루아의 테이블은 배열이자 해시라서, 정수 키로 이뤄진 리스트를 배열처럼 다룰 수 있어요. #list 연산자로 배열 길이를 얻을 수 있고, table 라이브러리 함수는 이 배열 관점에서 동작해요. 1부터 시작하는 인덱스가 루아의 규칙이에요.
정렬 비교와 안정성
table.sort의 comp는 완전한 순서(total order)를 만들어야 해요. a < a가 참이 되게 하거나, a < b와 b < a가 모두 참이 되는 경우는 정의되지 않아요. 정렬은 일반적으로 불안정(요소 순서가 입력의 원래 순서를 유지하지 않을)할 수 있어요.