oop/comparable/operators_need_comparable.rb

tests/_examples/oop/comparable/operators_need_comparable.rb in the metorex repository.

# The ordering operators come from Comparable, built on `<=>`. An object
# whose class does not include Comparable has no `<`, whatever `<=>` it
# answers, and a Comparable whose `<=>` answers nil names both sides in the
# ArgumentError.
class Plain
  def <=>(_other)
    0
  end
end

class Ranked
  include Comparable

  def initialize(rank)
    @rank = rank
  end

  attr_reader :rank

  def <=>(other)
    other.is_a?(Ranked) ? rank <=> other.rank : nil
  end
end

begin
  Plain.new < Plain.new
rescue NoMethodError => error
  puts(error.message)
end

p(Ranked.new(1) < Ranked.new(2))

[nil, 2.5, :sym, "text", [1]].each do |other|
  begin
    Ranked.new(1) < other
  rescue ArgumentError => error
    puts(error.message)
  end
end

extended = Plain.new
extended.extend(Comparable)
p(extended <= Plain.new)

Output:

undefined method '<' for an instance of Plain
true
comparison of Ranked with nil failed
comparison of Ranked with 2.5 failed
comparison of Ranked with :sym failed
comparison of Ranked with String failed
comparison of Ranked with Array failed
true