スペースシップ演算子

スペースシップ演算子<=>はsortで使われます。この演算子でクラスに全順序を入れることができます。

class Person
  attr_reader :name, :age

  def initialize(name, age)
    @name = name
    @age = age
  end

  def to_s
    "#{@name} (#{@age})"
  end

  def <=>(o)
    cmp = age <=> o.age
    cmp = name <=> o.name if cmp == 0
    cmp
  end
end

def person(name, age)
  Person.new(name, age)
end

people = [
  person("Bobby", 19),
  person("Alice", 23),
  person("Elvis", 19),
  person("David", 23),
  person("Grimm", 19),
  person("Fredy", 19),
  person("Chris", 26),
  person("Haris", 23),
]

puts people.sort

実行結果です。基本的に年齢順。年齢が同じなら名前の辞書順になります。

Bobby (19)
Elvis (19)
Fredy (19)
Grimm (19)
Alice (23)
David (23)
Haris (23)
Chris (26)