From: Wybo Dekker Date: 2006-02-04T19:40:16+09:00 Subject: how to vary sort's block? When I have an array of objects (Thing's, say) with two properties (say `name' and `amount') I want to be able to sort that array by either of these properties, depending on circumstances (like the value of the variable `order'). The script below is an example, and it works, but I don't like it. I there a better way to do it, without an if..else construction? For example, would it be possible to put several {|a,b|...} blocks for the sort in a hash with keys telling what I want to sort on? #!/usr/bin/ruby class Thing attr_reader :name,:amount def initialize(name,amount) @name,@amount = name,amount end def list puts ['',@name,@amount].join("\t") end end class Array def byamount self.sort { |a,b| a.amount <=> b.amount } end def byname self.sort { |a,b| a.name <=> b.name } end end arr = [ Thing.new('John',10), Thing.new('Anny',20) ] order = :byname puts "sorted #{order}:" if order == :byname arr.sort { |a,b| a.name <=> b.name }.each { |a| a.list # much more code may occur here... } elsif order == :byamount arr.sort { |a,b| a.amount <=> b.amount }.each { |a| a.list # much more code may occur here... } else raise "illegal order" end -- Wybo