[ruby] Ruby에서 버전을 비교하는 방법은 무엇입니까?

일부 버전 문자열을 비교하고 최신 버전을 얻기 위해 코드를 작성하는 방법은 무엇입니까?

예를 들어 다음과 같은 문자열 : '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')]


답변

Versionomygem을 사용할 수 있습니다 ( 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

(그리고 아마도 다른 모든 “평범한”비교).

<또는 원하는 경우> 테스트 예를 들어 할 수 있습니다.

(a1 <=> a2) < 0

또는 당신이 그렇게 기울이면 더 많은 기능 포장을하십시오.


답변

Gem::Version 여기로 이동하는 쉬운 방법입니다.

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


답변

보석을 사용하지 않고 손으로하고 싶다면 조금 엉망이기는하지만 다음과 같은 것이 작동 할 것입니다.

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

기본적으로 각 버전 문자열을 정수 배열로 변환 한 다음 배열 비교 연산자 를 사용합니다 . 누군가가 유지 관리해야 할 코드에 들어가면 좀 더 쉽게 따라 할 수 있도록 구성 요소 단계를 나눌 수 있습니다.