如何比较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