如何比较Ruby中的版本?

如何编写一段代码来比较一些版本的string,并获得最新的?

例如string如: '0.1', '0.2.1', '0.44'

 Gem::Version.new('0.4.1') > Gem::Version.new('0.10.1') 

如果你需要检查悲观的版本约束 ,你可以像这样使用Gem :: Dependency :

 Gem::Dependency.new('', '~> 1.4.5').match?('', '1.4.6beta4') 
 class Version < Array def initialize s super(s.split('.').map { |e| e.to_i }) end def < x (self <=> x) < 0 end def > x (self <=> x) > 0 end def == x (self <=> x) == 0 end end p [Version.new('1.2') < Version.new('1.2.1')] p [Version.new('1.2') < Version.new('1.10.1')] 

您可以使用Versionomy gem (在github上提供 ):

 require 'versionomy' v1 = Versionomy.parse('0.1') v2 = Versionomy.parse('0.2.1') v3 = Versionomy.parse('0.44') v1 < v2 # => true v2 < v3 # => true v1 > v2 # => false v2 > v3 # => false 

我会做

 a1 = v1.split('.').map{|s|s.to_i} a2 = v2.split('.').map{|s|s.to_i} 

那你可以做

 a1 <=> a2 

(也可能是所有其他的“常规”比较)。

…如果你想要一个<>testing,你可以做例如

 (a1 <=> a2) < 0 

或者如果你倾向于做更多的function包装。

Gem::Version是去这里的简单方法:

 %w<0.1 0.2.1 0.44>.map {|v| Gem::Version.new v}.max.to_s => "0.44" 

如果你想用手工做,而不使用任何gem,像下面这样的东西应该工作,虽然它有点看上去。

 versions = [ '0.10', '0.2.1', '0.4' ] versions.map{ |v| (v.split '.').collect(&:to_i) }.max.join '.' 

基本上,你将每个版本string转换为一个整数数组,然后使用数组比较运算符 。 如果代码需要维护,你可以分解组件的步骤来获得更容易的东西。

我也有同样的问题,我想要一个无铅版本的比较器,想出了这个:

 def compare_versions(versionString1,versionString2) v1 = versionString1.split('.').collect(&:to_i) v2 = versionString2.split('.').collect(&:to_i) #pad with zeroes so they're the same length while v1.length < v2.length v1.push(0) end while v2.length < v1.length v2.push(0) end for pair in v1.zip(v2) diff = pair[0] - pair[1] return diff if diff != 0 end return 0 end