On Oct 7, 2:21 am, Eric Hodel <drbr... / segment7.net> wrote:
> I haven't seen this technique in the wild before.
>
> If you have custom sorting using the spaceship:
>
> class Something
>    def <=>(other)
>      [@name, @version] <=> [other.name, other.version]
>    end
> end
>
> You can't easily use the more-efficient #sort_by because you'll need
> to know how to sort Somethings, which involves duplication:
>
> somethings.sort_by { |s| [s.name, s.version] }
>
> Instead you can add a method that returns the thing to sort by:
>
> class Something
>    def sort_obj
>      [@name, @version]
>    end
>
>    def <=>(other)
>      sort_obj <=> other.sort_obj
>    end
> end
>
> So now using #sort_by is easy:
>
> somethings.sort_by { |s| s.sort_obj }
>
> I don't know if the name #sort_obj is appropriate, but I'm not coming
> up with something better.
>
> See also:
>
> http://blog.segment7.net/articles/2007/10/07/sort_by-and-sort_obj

Nice. In fact, it seems this could dethrone <=> as the primary method
Sortable depends on.

Perhaps a better name is #indice or #sort_index, or something like
that.

T.