From: Trans Date: 2007-10-07T19:34:48+09:00 Subject: Re: #sort_by and #sort_obj On Oct 7, 2:21 am, Eric Hodel 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.