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の言い方によれば結果はbSet = {} 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はエラーを投げ出します!