I was playing with <=> recently, and I noticed that the following:
class Foo
def ==(other)
raise "uh oh"
end
end
p Foo.new == 42
prints (on Ruby 1.6 and 1.7):
-:3:in `==': uh oh (RuntimeError)
from -:6
However:
class Foo
include Comparable
def <=>(other)
raise "uh oh"
end
end
p Foo.new == 42
prints:
false
While this makes sense (if <=> raises an exception, then the two values
probably weren't equal), it is inconsistent. If an exception gets
propogated in one case, it should be propogated in another case. I
think it would be preferable for <=> to always propogate the exception,
since some exceptions (ArgumentError, NameError, etc.) often indicate
bugs, and catching them prevents unit tests from catching potential
problems.
Any thoughts?
Paul