Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

LUA 6

From ZeroWiki
Revision as of 15:29, 26 February 2012 by imported>fnwinter
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
  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을 수정하지 못하도록 하기 위해 재 정의 해주면 된다.

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

우선 간단한 함수를 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 추가로 링크 넣었습니다.

  1. 마무리

테이블은 정말 루아에 있어서는 가장 중요한 자료 구조인 것 같다. 테이블이라는 단순한 구조를 이렇게 다양하게 변형 시키다니 신기하면서도 뭔가 독특한 구조에 재미를 느꼈다.