Wednesday, May 16, 2012

Metatable 을 이용해 만든 집합연산

다음은 Chapter 13. Metatables and Metamethods / 13.1 – Arithmetic Metamethods 에 나온 Set 클래스를 다시 써 본 것.
 -- Metatable -------------------------------  
 SetMeta = {}  
   
 SetMeta.__tostring = function(a)  
      result = ""  
      for k in pairs(a) do  
           if(type(k) == "number") then -- 이것을 체크 안하면 함수까지 나열함  
                result = result .. k .. " "  
           end  
      end  
      return result  
 end  
   
 SetMeta.__add = function(a, b)   
      local result = Set.new{}  
      for k, v in pairs(a) do  
           if(v == true) then result[k] = true end  
      end  
      for k, v in pairs(b) do  
           if(v == true) then result[k] = true end  
      end  
      return result  
 end  
   
 SetMeta.__mul = function(a, b)   
      local result = Set.new{}  
   
      for k, v in pairs(a) do  
           if(type(k) == "number") then  
                if(v == true) then  
                     result[k] = b[k] -- nil 이 assign 되는 경우, 아무것도 안해주는 것과 동일.  
                end  
           end  
      end  
   
      return result  
 end  
   
 -- Set Class -------------------------------  
 Set = {}    
 function Set.new (a)  
      local instance = {}  
      for k, v in ipairs(a) do instance[v] = true end  
        
      function instance:printMe()  
           for k, v in pairs(self) do   
                if(type(k) == "number") then  
                     print(k, v)   
                end  
           end  
      end  
   
      setmetatable(instance, SetMeta)  
      return instance  
 end  
   
 -- Main -------------------------------  
 do  
      local a = Set.new{10, 20, 30}  
      local b = Set.new{20, 30, 40}  
      local c = a + b  
      local d = a * b  
      print("--------")  
      print(tostring(c))  
      print(tostring(d))  
      print("--------")  
      c:printMe()  
      print("--------")  
      d:printMe()  
 end  
키워드 : 집합 연산, union, intersection

No comments:

Post a Comment