→ Sorting objects in array in Ruby → → →

It's easy to sort a simple array in Ruby, you just do a=[1,3,2]; a.sort. But what if you want to sort array of objects? It's also very simple.

All you have to do is define a spaceship operator. What is spaceship operator? It's this: <=>. It returns three values for A and B. -1 if A<B, 0 if A=B and 1 if A>B.

module Geo
  class Distance
    KM = 'km'
    attr_reader :amount

    def initialize(amount, unit = KM) 
      @amount, @unit = amount, unit
    end

    def <=>(other)
      @amount <=> other.amount
    end

  end
end

distances = []
distances << Geo::Distance.new(1)
distances << Geo::Distance.new(4)
distances << Geo::Distance.new(2)
distances.sort

To prove that it worked we can display sorted values:

>> distances.sort.map {|d| d.amount}
=> [1, 2, 4]

Created on 15 June 2009