Tuesday, May 15, 2012

Metatables and Metamethods

Metatable이란 Metamethod라는 함수들을 담고 있는 테이블을 말한다. Metatable이 table에 붙으면 그 테이블의 행동양식이 바뀐다. 예를 들어 보통의 테이블은 + 로 더하는 operation을 할 수 없지만, + 연산의 정의를 갖고 있는 메타테이블을 추가해줌으로써 + 연산을 가능하게 할 수 있다. 다음의 __add나 __tostring이 metamethod 인데 __add 라는 이름은 + operator 를 사용할 수 있는 특별한 키워드이고, __tostring 은 tostring(obj)의 형태로 쓸 수 있게 하는 특별한 키워드이다. 그러한 키워드들은 Metatable Events 에 정리되어 있다.
 CharacterMeta = {}  
 CharacterMeta.__add = function(a, b)  
      return Character.new(a.name .. " " .. b.name, a.HP + b.HP)  
 end  
 CharacterMeta.__tostring = function(a)  
      return (a.name .. "\t" .. a.HP)  
 end  
   
 Character = {}  
 Character.new = function(name, HP)  
      local instance = {}  
      instance.name = name  
      instance.HP = HP  
      setmetatable(instance, CharacterMeta)  
      return instance  
 end  
   
 do  
      local heroine = Character.new("Marilyn", 10)  
      local hero = Character.new("Manson", 20)  
      print(tostring(heroine))  
      print(tostring(hero))  
        
      local hybrid = heroine + hero  
      print(tostring(hybrid))  
 end  

No comments:

Post a Comment