Я проверил источник и вот что я узнал:
Все операторы сравнения, определенные в Comparable, используют функцию rb_cmpint
вместе с <=>
. rb_cmpint
вызывает исключение, когда один из операндов равен нулю.
Таким образом, операторы Comparable вызывают исключение, если rhs не сравнимо с lhs. То есть 5 < 2
ложно, но 5 < "la"
вызывает исключение. Они делают это, чтобы различать случаи, когда <
не соответствует действительности, потому что rhs меньше, и случаев, когда это не так, потому что rhs не сопоставимы. Или другими словами: когда x < y
является ложным, это означает, что x >= y
является истинным. Таким образом, в случаях, когда это не так, возникает исключение.
==
вызов исключения будет плохим, потому что ==
обычно не требует (и не должен) сравнивать его операнды. Однако ==
использует тот же метод, что и другие операнды, что вызывает исключение. Таким образом, вся функция просто заключена в rb_rescue
. И это возвращает nil
, если выдается исключение.
Обратите внимание, что это относится только к ruby 1.8. Это было исправлено в 1.9, и теперь ==
никогда не возвращает nil
(за исключением, конечно, если вы определите свой собственный ==
, который это делает).