Luaリファレンス 要注意点 ~演算子オーバロード、メタメソッド~

演算子オーバーロード

pythonと同じ方針。メタメソッドに他の一般メソッドの参照を代入する

Set = {}
local _mtSet = {}               --> メタテーブル用

function Set.new (l)
    local set = {}
    setmetatable(set, _mtSet)   --> newで必ず、テーブルに対してメタテーブルが用意されるようにする。
    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}

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS