如何比较Ruby中的版本?

时间:2010-01-12 18:10:47

标签: ruby

如何编写一段代码来比较某些版本的字符串并获得最新的?

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

等字符串

8 个答案:

答案 0 :(得分:210)

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

答案 1 :(得分:32)

如果您需要检查pessimistic version constraints,可以像这样使用Gem::Dependency

Gem::Dependency.new('', '~> 1.4.5').match?('', '1.4.6beta4')

答案 2 :(得分:19)

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')]

答案 3 :(得分:15)

您可以使用Versionomy gemgithub提供):

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

答案 4 :(得分:9)

我愿意

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

然后你可以做

a1 <=> a2

(可能还有所有其他“常规”比较)。

...如果你想进行<>测试,你可以这样做。

(a1 <=> a2) < 0

如果您愿意,还可以做一些功能包装。

答案 5 :(得分:8)

Gem::Version是一个简单的方法:

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

答案 6 :(得分:4)

如果你想在不使用任何宝石的情况下手工完成,那么下面的东西应该可以工作,虽然它看起来很有意思。

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

基本上,您将每个版本字符串转换为整数数组,然后使用array comparison operator。你可以分解组件步骤,以便在需要维护的代码中使用时更容易理解。

答案 7 :(得分:-1)

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

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