문서의 선택한 두 판 사이의 차이를 보여줍니다.
— |
kb:luaapitable [2014/11/07 10:01] (현재) |
||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | ====== LuaApi/Table ====== | ||
+ | 테이블 다루기 | ||
+ | |||
+ | ===== lua_newtable ===== | ||
+ | <code cpp> | ||
+ | void lua_newtable (lua_State *L); | ||
+ | </code> | ||
+ | 빈 테이블을 생성해서 스택의 제일 위에다 놓는다. | ||
+ | |||
+ | ===== lua_gettable ===== | ||
+ | <code cpp> | ||
+ | void lua_gettable (lua_State *L, int index); | ||
+ | </code> | ||
+ | 테이블에 들어있는 값 중에 하나를 읽어와서 스택 맨 위에다 놓는다. index 값은 테이블의 위치다. 테이블에 있는 값 중, 어느 것을 뽑을 것인가를 정하기 위해서 스택의 제일 위에 있는 값을 키로 사용하고, 팝한다. 그러므로 lua_gettable 함수를 호출하기 전에 lua_push... 시리즈 중에 하나를 호출해서 키 값을 푸시해둬야 한다. | ||
+ | <code cpp> | ||
+ | lua_pushnumber(L, 1); // 테이블의 '1' 키에 대응하는 값을 원한다. | ||
+ | lua_gettable(L, t); // t는 테이블의 인덱스 | ||
+ | </code> | ||
+ | <code> | ||
+ | 호출 전의 스택 호출 후의 스택 | ||
+ | +-------+ +-------+ | ||
+ | | key | | value | | ||
+ | +-------+ +-------+ | ||
+ | | ... | | ... | | ||
+ | +-------+ +-------+ | ||
+ | | ... | | ... | | ||
+ | +-------+ +-------+ | ||
+ | </code> | ||
+ | 이 함수는 테이블 안의 "index" 메타 메서드를 호출할 수도 있다. 이 경우 동작이 전혀 달라질 수 있다. 테이블 안의 값만을 원한다면, lua_rawget 함수를 사용해야 한다. | ||
+ | |||
+ | ===== lua_rawget ===== | ||
+ | <code cpp> | ||
+ | void lua_rawget (lua_State *L, int index); | ||
+ | </code> | ||
+ | lua_gettable 함수와 마찬가지로, 주어진 index 위치에 있는 테이블의 값 중에, 스택의 맨 위에 있는 값을 키로 사용해 뽑은 다음, 그 값을 스택의 맨 위에다 놓는다. | ||
+ | |||
+ | ===== lua_settable ===== | ||
+ | <code cpp> | ||
+ | void lua_settable (lua_State *L, int index); | ||
+ | </code> | ||
+ | 스택에서 키와 값, 즉 2개의 값을 팝해서, 주어진 index 위치에 있는 테이블의 값으로 설정한다. 즉 lua_settable 함수를 호출하기 전에 두 개의 값을 푸쉬해둬야 한다. | ||
+ | <code cpp> | ||
+ | lua_pushnumber(L, key); // 키를 푸쉬 | ||
+ | lua_pushnumber(L, value); // 값을 푸쉬 | ||
+ | lua_settable(L, t); // 테이블의 값을 설정 | ||
+ | </code> | ||
+ | <code> | ||
+ | 호출 전의 스택 호출 후의 스택 | ||
+ | +-------+ +-------+ | ||
+ | | value | | ... | | ||
+ | +-------+ +-------+ | ||
+ | | key | | ... | | ||
+ | +-------+ +-------+ | ||
+ | | ... | | ... | | ||
+ | +-------+ +-------+ | ||
+ | </code> | ||
+ | 이 함수는 테이블 안의 "settable"과 "newindex" 메타 메서드를 호출할 수도 있다. 순수하게 값을 설정하기만을 원한다면, lua_rawset 함수를 사용해야 한다. | ||
+ | |||
+ | ===== lua_rawset ===== | ||
+ | <code cpp> | ||
+ | void lua_rawset (lua_State *L, int index); | ||
+ | </code> | ||
+ | lua_settable 함수와 마찬가지로 스택에서 키와 값, 즉 2개의 값을 팝해서, 주어진 index 위치에 있는 테이블의 값으로 설정한다. | ||
+ | |||
+ | ===== lua_next ===== | ||
+ | <code cpp> | ||
+ | int lua_next (lua_State *L, int index); | ||
+ | </code> | ||
+ | 테이블을 횡단(traverse)하기 위해서 사용하는 함수다. 호출할 때마다 스택의 맨 위에서 키를 팝한 다음, index 위치에 있는 테이블의 키와 해당하는 값을 스택에다 푸시한다. 최초에 횡단을 시작하기 위해서는 nil 값을 푸시해두면 된다. 더 이상 횡단할 쌍이 존재하지 않으면, lua_next 함수는 0을 반환한다. | ||
+ | <code> | ||
+ | 호출 전의 스택 호출 후의 스택 | ||
+ | +-------+ +-------+ | ||
+ | | key | | value | | ||
+ | +-------+ +-------+ | ||
+ | | ... | | key | | ||
+ | +-------+ +-------+ | ||
+ | | ... | | ... | | ||
+ | +-------+ +-------+ | ||
+ | </code> | ||
+ | 다음과 같은 형식으로 테이블을 횡단할 수 있다. | ||
+ | <code cpp> | ||
+ | // 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 | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ===== lua_rawgeti ===== | ||
+ | <code cpp> | ||
+ | void lua_rawgeti (lua_State *L, int index, int n); | ||
+ | </code> | ||
+ | 테이블을 배열로 사용하는 경우에 주로 사용하는 함수다. index 위치에 있는 테이블의 n 번째 원소의 값을 읽어와, 스택의 맨 위에다 푸쉬한다. 즉 다음의 구문과 같은 기능이다. | ||
+ | <code cpp> | ||
+ | lua_pushnumber(L, n); | ||
+ | lua_rawget(L, index); | ||
+ | </code> | ||
+ | |||
+ | ===== lua_rawseti ===== | ||
+ | <code cpp> | ||
+ | void lua_rawseti (lua_State *L, int index, int n); | ||
+ | </code> | ||
+ | 테이블을 배열로 사용하는 경우에 주로 사용하는 함수다. index 위치에 있는 테이블의 n 번째 원소의 값을 스택의 맨 위에 있는 값으로 설정한 다음, 팝한다. 호출하기 전에 설정할 값을 푸쉬해야 한다. | ||
+ | <code cpp> | ||
+ | lua_pushnumber(L, value); | ||
+ | lua_rawseti(L, index, n); | ||
+ | </code> | ||
+ | 이는 결국 다음의 구문과 같다. | ||
+ | <code cpp> | ||
+ | lua_pushnumber(L, n); | ||
+ | lua_pushnumber(L, value); | ||
+ | lua_rawset(L, index); | ||
+ | </code> | ||
+ | |||
+ | ---- | ||
+ | * see also [[LuaApi]] | ||