일부 버전 문자열을 비교하고 최신 버전을 얻기 위해 코드를 작성하는 방법은 무엇입니까?
예를 들어 다음과 같은 문자열 : '0.1', '0.2.1', '0.44'
.
일부 버전 문자열을 비교하고 최신 버전을 얻기 위해 코드를 작성하는 방법은 무엇입니까?
예를 들어 다음과 같은 문자열 : '0.1', '0.2.1', '0.44'
.
답변:
Gem::Version.new('0.4.1') > Gem::Version.new('0.10.1')
Gem::Version...
구문은 제가 보석을 설치해야 할 것이라고 생각했다. 그러나 그것은 필요하지 않았습니다.
Gem::Dependency.new(nil, '~> 1.4.5').match?(nil, '1.4.6beta4')
require 'rubygems'
액세스하려면 이 필요합니다 Gem
. 그러나 1.9부터는 자동으로 포함됩니다.
비관적 버전 제약 을 확인해야하는 경우 다음 과 같이 Gem :: Dependency를 사용할 수 있습니다 .
Gem::Dependency.new('', '~> 1.4.5').match?('', '1.4.6beta4')
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')]
vers = (1..3000000).map{|x| "0.0.#{x}"}; 'ok' puts Time.now; vers.map{|v| ComparableVersion.new(v) }.sort.first; puts Time.now # 24 seconds 2013-10-29 13:36:09 -0700 2013-10-29 13:36:33 -0700 => nil puts Time.now; vers.map{|v| Gem::Version.new(v) }.sort.first; puts Time.now # 41 seconds 2013-10-29 13:36:53 -0700 2013-10-29 13:37:34 -0700
코드 blob은 그것을 추악하게 만들지 만 기본적으로 this vs Gem :: Version 사용은 약 두 배 더 빠릅니다.
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
(그리고 아마도 다른 모든 "평범한"비교).
... <
또는 원하는 경우>
테스트 예를 들어 할 수 있습니다.
(a1 <=> a2) < 0
또는 당신이 그렇게 기울이면 더 많은 기능 포장을하십시오.
Gem::Version
여기로 이동하는 쉬운 방법입니다.
%w<0.1 0.2.1 0.44>.map {|v| Gem::Version.new v}.max.to_s
=> "0.44"
나는 같은 문제가 있었고 Gem-less 버전 비교기를 원했고 다음과 같이 생각했습니다.
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
Version
필요한 모든 작업을 수행하는 간단한 클래스를 작성했습니다 . shorts.jeffkreeftmeijer.com/2014/…