사용자 도구

사이트 도구


kb:luaapitable

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

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]]
  
kb/luaapitable.txt · 마지막으로 수정됨: 2014/11/07 10:01 (바깥 편집)