関係メタメソッド

メタメソッドを持つ表と一緒に比較演算子を使用するときに、__eq メタメソッド、__lt メタメソッド、 および __le メタメソッドが呼び出されます。 Lua は、両方の表が同じメタテーブルを持つ場合にだけ、関係メタメソッドを呼び出します。 Lua は、同じメタテーブルを持っていない 2 つのオブジェクトを比較するためにいずれかの関係演算子が使用されると、 常に false を返します。

  • __eqは等号演算子==, !=, <>, ~=に対して呼び出される
  • __ltは、<と>=という劣等演算子のために呼び出される
  • 演算子 <= と > の小なり、または等しい場合に __le が呼び出される

a>=bはnot(a<b)と同じ、a!=bはnot(a==b)、a>bはnot(a<=b)であることに注意。 Lua インタープリターは関係演算子を自動的に変換するため、開発者は上記の 3 つのメタメソッドを実装する必要があるだけです。

mt={}
mt["__eq"] = function(a,b)
for k,v in pairs(a) do
if b[k] != v then return false end
end
for k,v in pairs(b) do
if a[k] != v then return false end
end
return true
end

t1={1,2,3}
t2={1,2,3}
setmetatable(t1,mt)
setmetatable(t2,mt)
if t1 != t2 then error("Tables are not equal!",0) end