On 08/03/07, carp __ <carp / hacksocke.de> wrote:
> Hello Rubyists,
>
> I want to sort an array of objects of the same class (MyClass). The
> array should be sorted by arbitrary attributes of that class, but the
> problem is that one attribute can be nil.
>
> The code looks like this:
>
> my_array.sort {
>   |x,y| x.some_attribute <=> y.some_attribute
> }
>
> Naturally, if some_attribute is nil, the comparison failed (since nil is
> not comparable). I am  looking for something like this:
>
> my_array.sort {
>   |x,y| x.some_attribute <=> y.some_attribute unless
> (x.some_attribute.nil? or y.some_attribute.nil?)
> }
>
> which I have tried without having success (Error was: comparison of
> MyClass with MyClass failed).
>
> Does anyone know how to do it? Thanks in advance!

Define <=> on your class:

class MyClass
  def <=>(other)
    if @some_attribute.nil?
      return -1
    elsif @other.some_attribute.nil?
      return 1
    else
      @some_attribute <=> other.some_attribute
    end
  end
end

Farrel