E D R , A S I H C RSS

LUA_6

1. 메타 테이블

메타 테이블은 루아에서 테이블을 사용하는 연산자 재정의? 또는 python을 예로 들면 add, sub 와 같은 함수라고 볼 수 있습니다. 테이블을 함수가 아닌 연산자로 조작 할 수 있게끔 해 줍니다.

x = { value = 3 } -- x라는 테이블을 만듬
mt = { __add = function(a,b) return { value = a.value + b.value } end } -- '+' 연산자에 대한 metatable을 작성
setmetatable(x,mt) -- x라는 테이블에 mt를 연결
double = x + x -- x 테이블에 '+' 연산을 하면 metatable이 수행되 덧셈 결과가 새로운 table로 반환 됨
print(double.value) -- 새로운 테이블의 값을 출력
6

메타 함수는 __add 연산자 이외에 아래와 같은 연산자들이 있습니다.

__unm : Unary 연산자 예를 들면 -1 의 -와 같은 피 연산자가 하나 인 연산자를 위한 meta 함수
__add : + 연산자
__sub : - 연산자
__mul : * 연산자
__div : / 연산자
__pow : ^ 연산자
__concat .. : string 연결 연산자
__eq : == 조건 연산자
__lt < , > less than 연산자
__le >=,<= less than or equal 연산자

연산자 이외에 table에 대한 event 들도 연결할 수 있습니다.

mt.__index = function(x,key)
if key == 'copy_value' then return { value = x.value } end
end
new = x.copy_value
print(new.value)
3

__newindex : 새로운 index가 추가 되었을 경우에 호출 되는 meta 함수
__metatable : metatable을 보호하기 위한 metatable 프로그램이 metatable을 수정하지 못하도록 하기 위해 재 정의 해주면 된다.

2. 메타 테이블을 이용한 클래스

우선 간단한 함수를 table 안에 만들어 보겠습니다.

instance = { value = 0, set_value = function(self, value) self.value = value end }
instance.set_value(10) ---- self 가 없어서 에러가 발생
stdin:1: attempt to index local 'self' (a number value)
stack traceback:
stdin:1: in function 'set_value'
stdin:1: in main chunk
C: ?
instance.set_value(instance,10) --- self에 자기 자신을 넣어서 OK
print(instance.value)
10
instance:set_value(20) --- ':'를 쓰면 self를 안써도 됨
print(instance.value)
20

콜론이 ":" 이 함수에서 사용 될 경우는 함수의 파라미터로 self를 생략하게 할 수 있습니다.

그럼 이제 class를 만들어 보겠습니다.


class를 만들기 위한 페이지 http://lua-users.org/wiki/YetAnotherClassImplementation 추가로 링크 넣었습니다.

3. 마무리

테이블은 정말 루아에 있어서는 가장 중요한 자료 구조인 것 같다. 테이블이라는 단순한 구조를 이렇게 다양하게 변형 시키다니 신기하면서도 뭔가 독특한 구조에 재미를 느꼈다.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2012-02-26 15:29:46
Processing time 0.0938 sec