結論は、「比較演算子(<
, ==
, >
)ではなく、<=>
を再定義すべし」。
当初の疑問
>
と<
と==
の整合性ってどうやって取るんだっけ?
答え
def <=>(other)
~~(javaでいうObject#compareTo)~~を再定義する。他の>
, <
, ==
は触らない。
from: https://stackoverflow.com/a/13973761
def ==(other)
の実装は、return True if self<=>other == 0 else False
のようになっている。
(https://docs.ruby-lang.org/ja/latest/class/Comparable.html)
考察
なぜこんがらがったのかを考えてみた。Javaだと、
- 比較演算子(
==
,<
,>
)の挙動を書き換えることはできない。 - equalsToとcompareToを書き換えても、これによって比較演算子(
==
,<
,>
)の結果が変わることはない。(確かsortingの並び順は変わるはずだ)
一方rubyだと、
- 比較演算子(
==
,<
,>
)の挙動を書き換えることはできる。 - また、
<=>
を書き換えることによっても、比較演算子の挙動が変わる。