2015. 9. 20. 22:05ㆍ프로그래밍/Script
테이블의 한계
테이블은 아주 중요한 자료형. 대부분의 작업이 테이블에서 가능하다.
하지만 한계도 있다.
ex) 테이블 간의 비교와 연산은 불가능.
1 | tblRes = tbl1 + tbl2 -- X | cs |
이런 것을 가능하게 하는 것이 메타테이블
테이블간의 덧셈연산도 가능하고 필요시 다른 작업으로 치환해서 사용할 수 있다.
메타테이블 정보 출력
루아에서 테이블들은 각각 메타테이블을 가지고 있다.
사용자 데이터 역시 메타테이블을 가지고 있다.
메타테이블 확인 함수
1 | getmetatable(tbl) | cs |
메타테이블이 설정되어 있지 않다면 해당 함수는 nil을 반환한다.
메타테이블 설정하기
1 | setmetatable(tbl, metatbl) | cs |
메타테이블을 지정하면 미리 정의된 함수들로 함수를 재정의 할 수 있다.
그리고 따로 함수를 정의하고 그 함수 포인터를 넘겨주는 형태인듯.
함수 포인터 + 오버라이딩 느낌
__add 함수를 union으로 재정의 하였다.
union 함수는 두 테이블을 합집합 하는 함수로 중복되는 키가 있을 경우 첫 번째 테이블의 값을 우선한다.
메타테이블 정의 지원 항목
+ 연산 - __add
- 연산 - __sub
* 연산 - __mul
/ 연산 - __div
^ 연산 - __pow
- (음수 연산자) - __unm
< 연산 - __lt
<= 연산 - __le
.. 연산 - __concat
테이블에 인덱스 값을 얻을 때 - __index
테이블에 유효한 인덱스 값을 얻을 때 - __gettable
테이블에 새로운 인덱스 값을 만들려고 할 때 - __newindex
테이블에 인덱스에 새로운 값을 저장하려고 할 때 - __settable
함수가 호출 될 때 - __call
가비지 컬렉션이 호출 될 때 - __gc
'프로그래밍 > Script' 카테고리의 다른 글
[루아] Lua에서 .과 :의 차이(?) + OOP (4) | 2015.12.17 |
---|---|
개론 (2) | 2015.10.01 |
Lua와 C 바인딩 (0) | 2015.09.20 |
Lua 5.x와 4.0 호환성 (0) | 2015.09.20 |
Lua 조건문, 반복문 (0) | 2015.09.19 |
Lua 연산자 (0) | 2015.09.19 |
Lua 함수 (0) | 2015.09.19 |