4

アンタッチャブル プログラムのある時点で、2 つの Lua 値の比較が行われます。

return a==b;

==これを に変換する必要がある>=ため、次のハックにたどり着きました:

a = { value=5 }
b = { value=2 }

mt = {
  __eq = function (op1, op2) 
    return op1.value >= op2.value
  end
}

setmetatable(a, mt)
setmetatable(b, mt)

print(a == b)

これにより、期待される結果が得られます ( true)。さて、問題は、abが異なるコンテキストにあるため、次のことができません。

setmetatable(a, mt)
setmetatable(b, mt)

代わりに、次のことができます。

mtA = {
  __eq = function (op1, op2) 
    return op1.value >= op2.value
  end
}
setmetatable(a, mtA)


mtB = {
  __eq = function (op1, op2) 
    return op1.value >= op2.value
  end
}
setmetatable(b, mtB)

しかし、aandbはさまざまなタイプであり、オーバーロードに達することなく==演算子が返されます。false__eq

必要なものを達成する方法について何か考えはありますか?

4

1 に答える 1

3

Lua 5.2 では、オーバーライド__eqは異なるタイプのオブジェクトで正常に機能します。ただし、次のように、2 つのメタテーブルが両方とも同じ関数を指している限り、5.1 では問題なく動作するはずです。

local a, b = { value=5 }, { value=2 }

local function meta_eq(op1, op2) 
  return op1.value >= op2.value
end

setmetatable(a, { __eq = meta_eq })
setmetatable(b, { __eq = meta_eq })

print(a == b) -- true

__eqに加えて、それぞれ > および >= をオーバーライドする__gtおよびメタメソッドがあることも指摘しておく価値があるかもしれません。__ge

于 2012-10-19T14:18:03.963 に答える