From: Eric Hodel Date: 2007-10-08T09:07:08+09:00 Subject: Re: #sort_by and #sort_obj On Oct 7, 2007, at 03:34 , 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. My primary goal was reducing the number of method calls and objects created, boosting speed. The downside to this is that you can't sort heterogeneous collections using #sort_obj. When sorting using #<=> this would be easier. -- Poor workers blame their tools. Good workers build better tools. The best workers get their tools to do the work for them. -- Syndicate Wars