From: "David A. Black" Date: 2007-10-07T23:42:57+09:00 Subject: Re: #sort_by and #sort_obj Hi -- On Sun, 7 Oct 2007, Trans wrote: > > > 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. I think Eric intends it to return a kind of sort key, not to actually specify the sorting algorithm. > Perhaps a better name is #indice or #sort_index, or something like > that. I'm afraid "indice" isn't a word :-) The singular of indices is index. David -- Upcoming training from Ruby Power and Light, LLC: * Intro to Ruby on Rails, Edison, NJ, October 23-26 * Advancing with Rails, Edison, NJ, November 6-9 Both taught by David A. Black. See http://www.rubypal.com for more info!