lua学習ノートday 11-----metatableとmetamathodsの関係演算
4620 ワード
luaに明確なmetamathodsの関係演算子は以下の3つしかありません:_eq(=),_lt(残りの3種類のa~=b未満はnot(a==b)a>b,b<=a>=b,baであると考えることに相当する.しかし、このような考えには抜け穴がある.2枚のテーブルを比較する場合、a<=bをaがbのサブセットと定義する.a={1,2,3,4}b={2,3,4,5}a<=bは成り立たず,luaの言い方によれば結果はb
上記コードではltの実装をleで実現し,<を呼び出すとmetatableの__がトリガーされる.lt,この関数呼び出し_le,真を返し,a<=bを説明し,bにaに備わっていない元素が含まれていることを証明すれば,a共通のmetamathodsを持つ2つのオブジェクトのみluaは関係演算を行い、他の場合luaはエラーを投げ出します!
Set = {}
Set.mt = {}
function Set.New(t)
local set = {}
setmetatable(set,Set.mt)
for _,i in ipairs(t) do set[i] = true end
return set
end
function Set.eq(a,b)
for k in pairs(a) do
if not (b[k]) then return false end
end
return true
end
function Set.le(a,b)
for k in pairs(a) do
if not(b[k]) then return false end
end
return true
end
function Set.lt(a,b)
return a <= b and not(b <= a)
end
do
Set.mt.__eq = Set.eq
Set.mt.__le = Set.le
Set.mt.__lt = Set.lt
s1 = Set.New{10,20,30,40}
s2 = Set.New{1,2,10,20}
print(s1 <= s2)
print("
")
print(s2 < s1)
end
上記コードではltの実装をleで実現し,<を呼び出すとmetatableの__がトリガーされる.lt,この関数呼び出し_le,真を返し,a<=bを説明し,bにaに備わっていない元素が含まれていることを証明すれば,a共通のmetamathodsを持つ2つのオブジェクトのみluaは関係演算を行い、他の場合luaはエラーを投げ出します!