From: ts Date: 2004-04-23T22:54:19+09:00 Subject: Re: find a best version (of a package) >>>>> "s" == saiph writes: s> vv = ['ruby-2.2.5', 'ruby-3.2.6', 'ruby-5'] s> i = vv.best_version? s> how would you write or change this? Well, like said previously it's faster to do it if all your numbers have only one digit. s> def newer?(s) s> def best_version? generally a method with ? at the end, return true or false perhaps best to change the name. Something like this (not tested) svg% cat b.rb #!/usr/bin/ruby class String REG = /\A\w+-(?=[\d.]+\z)/ def newer(s) return nil unless self[REG] == s[REG] a = self.scan(/(\d+)\.?/).flatten b = s.scan(/(\d+)\.?/).flatten a.zip(b) do |x, y| t = x.to_i <=> y.to_i return t unless t.zero? end 0 end end class Array def best_version inject do |res, elem| t = res.newer(elem) return nil if t.nil? t>=0 ? res : elem end end end vv = ['ruby-2.2.5', 'ruby-3.2.6', 'ruby-5'] puts vv.best_version svg% svg% b.rb ruby-5 svg% Guy Decoux