사용자 도구

사이트 도구


kb:luaapitable

LuaApi/Table

테이블 다루기

lua_newtable

void lua_newtable (lua_State *L);

빈 테이블을 생성해서 스택의 제일 위에다 놓는다.

lua_gettable

void lua_gettable (lua_State *L, int index);

테이블에 들어있는 값 중에 하나를 읽어와서 스택 맨 위에다 놓는다. index 값은 테이블의 위치다. 테이블에 있는 값 중, 어느 것을 뽑을 것인가를 정하기 위해서 스택의 제일 위에 있는 값을 키로 사용하고, 팝한다. 그러므로 lua_gettable 함수를 호출하기 전에 lua_push… 시리즈 중에 하나를 호출해서 키 값을 푸시해둬야 한다.

lua_pushnumber(L, 1); // 테이블의 '1' 키에 대응하는 값을 원한다.
lua_gettable(L, t);   // t는 테이블의 인덱스
호출 전의 스택                   호출 후의 스택
+-------+                        +-------+
|  key  |                        | value | 
+-------+                        +-------+
|  ...  |                        |  ...  |
+-------+                        +-------+
|  ...  |                        |  ...  |
+-------+                        +-------+

이 함수는 테이블 안의 “index” 메타 메서드를 호출할 수도 있다. 이 경우 동작이 전혀 달라질 수 있다. 테이블 안의 값만을 원한다면, lua_rawget 함수를 사용해야 한다.

lua_rawget

void lua_rawget (lua_State *L, int index);

lua_gettable 함수와 마찬가지로, 주어진 index 위치에 있는 테이블의 값 중에, 스택의 맨 위에 있는 값을 키로 사용해 뽑은 다음, 그 값을 스택의 맨 위에다 놓는다.

lua_settable

void lua_settable (lua_State *L, int index);

스택에서 키와 값, 즉 2개의 값을 팝해서, 주어진 index 위치에 있는 테이블의 값으로 설정한다. 즉 lua_settable 함수를 호출하기 전에 두 개의 값을 푸쉬해둬야 한다.

lua_pushnumber(L, key);    // 키를 푸쉬
lua_pushnumber(L, value);  // 값을 푸쉬
lua_settable(L, t);        // 테이블의 값을 설정
호출 전의 스택                   호출 후의 스택
+-------+                        +-------+
| value |                        |  ...  | 
+-------+                        +-------+
|  key  |                        |  ...  |
+-------+                        +-------+
|  ...  |                        |  ...  |
+-------+                        +-------+

이 함수는 테이블 안의 “settable”과 “newindex” 메타 메서드를 호출할 수도 있다. 순수하게 값을 설정하기만을 원한다면, lua_rawset 함수를 사용해야 한다.

lua_rawset

void lua_rawset (lua_State *L, int index);

lua_settable 함수와 마찬가지로 스택에서 키와 값, 즉 2개의 값을 팝해서, 주어진 index 위치에 있는 테이블의 값으로 설정한다.

lua_next

int lua_next (lua_State *L, int index);

테이블을 횡단(traverse)하기 위해서 사용하는 함수다. 호출할 때마다 스택의 맨 위에서 키를 팝한 다음, index 위치에 있는 테이블의 키와 해당하는 값을 스택에다 푸시한다. 최초에 횡단을 시작하기 위해서는 nil 값을 푸시해두면 된다. 더 이상 횡단할 쌍이 존재하지 않으면, lua_next 함수는 0을 반환한다.

호출 전의 스택                   호출 후의 스택
+-------+                        +-------+
|  key  |                        | value | 
+-------+                        +-------+
|  ...  |                        |  key  |
+-------+                        +-------+
|  ...  |                        |  ...  |
+-------+                        +-------+

다음과 같은 형식으로 테이블을 횡단할 수 있다.

// table is in the stack at index `t'
lua_pushnil(L); // first key
while (lua_next(L, t) != 0) 
{
    // `key' is at index -2 and `value' at index -1
    printf("%s - %s\n",
    lua_typename(L, lua_type(L, -2)), lua_typename(L, lua_type(L, -1)));
    lua_pop(L, 1); // removes `value'; keeps `key' for next iteration
}

lua_rawgeti

void lua_rawgeti (lua_State *L, int index, int n);

테이블을 배열로 사용하는 경우에 주로 사용하는 함수다. index 위치에 있는 테이블의 n 번째 원소의 값을 읽어와, 스택의 맨 위에다 푸쉬한다. 즉 다음의 구문과 같은 기능이다.

lua_pushnumber(L, n);
lua_rawget(L, index);

lua_rawseti

void lua_rawseti (lua_State *L, int index, int n);

테이블을 배열로 사용하는 경우에 주로 사용하는 함수다. index 위치에 있는 테이블의 n 번째 원소의 값을 스택의 맨 위에 있는 값으로 설정한 다음, 팝한다. 호출하기 전에 설정할 값을 푸쉬해야 한다.

lua_pushnumber(L, value);
lua_rawseti(L, index, n);

이는 결국 다음의 구문과 같다.

lua_pushnumber(L, n);
lua_pushnumber(L, value);
lua_rawset(L, index);

kb/luaapitable.txt · 마지막으로 수정됨: 2014/11/07 10:01 (바깥 편집)