-- 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
Wednesday, May 16, 2012
Metatable 을 이용해 만든 집합연산
다음은 Chapter 13. Metatables and Metamethods / 13.1 – Arithmetic Metamethods 에 나온 Set 클래스를 다시 써 본 것.
Labels:
Lua
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment