Как сравнить версии в Ruby? - PullRequest
108 голосов
/ 12 января 2010

Как написать кусок кода, чтобы сравнить строки некоторых версий и получить самые новые?

Например, такие строки, как: '0.1', '0.2.1', '0.44'.

Ответы [ 8 ]

211 голосов
/ 17 июня 2010
Gem::Version.new('0.4.1') > Gem::Version.new('0.10.1')
32 голосов
/ 03 июля 2013

Если вам нужно проверить ограничения пессимистической версии , вы можете использовать Gem :: Dependency следующим образом:

Gem::Dependency.new('', '~> 1.4.5').match?('', '1.4.6beta4')
19 голосов
/ 12 января 2010
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')]
15 голосов
/ 12 января 2010

Вы можете использовать Versionomy самоцвет (доступно на 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
9 голосов
/ 12 января 2010

Я бы сделал

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

Тогда вы можете сделать

a1 <=> a2

(и, вероятно, все другие "обычные" сравнения).

... и если вам нужен тест < или >, вы можете сделать, например,

(a1 <=> a2) < 0

или сделайте еще несколько функций, если вы так склонны.

8 голосов
/ 31 июля 2012

Gem::Version это простой способ перейти сюда:

%w<0.1 0.2.1 0.44>.map {|v| Gem::Version.new v}.max.to_s
=> "0.44"
5 голосов
/ 12 января 2010

Если вы хотите сделать это вручную, без использования каких-либо драгоценных камней, должно сработать что-то вроде следующего, хотя это выглядит немного глупо.

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

По сути, вы превращаете каждую строку версии в массив целых чисел, а затем используете оператор сравнения массивов . Вы можете разбить шаги компонента, чтобы получить что-то более легкое для выполнения, если это происходит в коде, который кто-то должен будет поддерживать.

0 голосов
/ 21 октября 2015

У меня была та же проблема, я хотел компаратор версии без 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...