Set = {}
local _mtSet = {} --> メタテーブル用
function Set.new (l)
local set = {}
setmetatable(set, _mtSet) --> テーブルに対してメタテーブルが用意されるようにする。
for _, v in ipairs(l) do set[v] = true end
return set
end
function Set.union(a, b)
local res = Set.new{}
for k in pairs(a) do res[k] = true end
for k in pairs(b) do res[k] = true end
return res
end
s1 = Set.new{10, 20, 30, 50}
s2 = Set.new{30, 1, 60}
print(getmetatable(s1)) --> table : 00000000xxxxx1
print(getmetatable(s2)) --> table : 00000000xxxxx2
_mtSet.__add = Set.union --> メタテーブル __add に代入する(ことで、「+」の振る舞いを変える
s3 = s1 + s2 --->s3 = Set.union(s1, s2) --> {1,10,20,30,50, 60}
Set = {}
local _mtSet = {} --> メタテーブル用
function Set.new (l)
local set = {}
setmetatable(set, _mtSet)
for _, v in ipairs(l) do set[v] = true end
return set
end
function Set.union(a, b)
local res = Set.new{}
for k in pairs(a) do res[k] = true end
for k in pairs(b) do res[k] = true end
return res
end
s1 = Set.new{10, 20, 30, 50}
s2 = Set.new{30, 1, 60}
print(getmetatable(s1)) --> table : 00000000xxxxx1
print(getmetatable(s2)) --> table : 00000000xxxxx2
_mtSet.__add = Set.union
_mtSet.__metatable = "not your business" --メタテーブルをロック。真の値を入れさえすればよい。
print(getmetatable(s1)) --> not your business
_mtSet._mul = Set.union
setmetatable(s1, {}) --> cannot change protected metatable
local key = {} -- これはkeyとしてアドレスを使用することで一意性を確保する
local mt = {__index = function (t) return t[key] end }
function setDefault(t, d)
t[key] = d
setmetatable(t, mt)
end
-- keyは「table: 000000005FD180」 みたいな値となる(実行する度に変わる)
function function_event (func, ...)
if type(func) == "function" then
return func(...) -- プリミティブの call
else
local h = metatable(func).__call
if h then
return h(func, ...)
else
error(···)
end
end
end