कुछ संस्करणों के तार की तुलना करने और नवीनतम प्राप्त करने के लिए कोड का एक टुकड़ा कैसे लिखें?
उदाहरण के लिए तार जैसे '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.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 कोड ब्लॉब इसे बदसूरत बना रहा है, लेकिन मूल रूप से, यह बनाम जेम :: संस्करण का उपयोग करके लगभग दोगुना तेज है।
आप Versionomyमणि का उपयोग कर सकते हैं ( गीथूब पर उपलब्ध ):
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 '.'
अनिवार्य रूप से, आप प्रत्येक संस्करण स्ट्रिंग को पूर्णांकों की एक सरणी में बदल देते हैं और फिर सरणी तुलना ऑपरेटर का उपयोग करते हैं । आप घटक चरणों को तोड़ सकते हैं ताकि कुछ का पालन करने के लिए कुछ आसान हो सके अगर यह कोड में चल रहा है तो किसी को बनाए रखने की आवश्यकता होगी।
मुझे एक ही समस्या थी, मैं एक जेम-कम संस्करण तुलनित्र चाहता था, इसके साथ आया:
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// ...