Saya perlu membandingkan batasan versi pesimis beberapa waktu lalu, tetapi saya tidak ingin bergantung pada RubyGems untuk melakukannya, jadi saya menulis Versionkelas sederhana yang melakukan semua yang saya butuhkan: shorts.jeffkreeftmeijer.com/2014/…
The Gem::Version...sintaks membuat saya pikir saya akan perlu menginstal permata. Tapi itu tidak diperlukan.
Guillaume
Catatan: Ini memberikan kesalahan tentang variabel 'Permata' yang tidak ditentukan untuk saya di Ruby 1.x, tetapi berfungsi seperti yang diharapkan di Ruby 2.x. Dalam kasus saya, saya memeriksa RUBY_VERSION bukan Ruby 1.x (bukan 2.x), jadi saya hanya melakukan RUBY_VERSION.split ('.') [0] == "1" seperti John Hyland dan DigitalRoss melakukannya.
@uli, bukan Ruby 1. vs 2.; 1.8.x vs 1.9+. Ruby melalui 1.8.x tidak menyertakan rubygems secara default; Anda memerlukan require 'rubygems'untuk mendapatkan akses ke Gemnamespace. Dari 1.9, bagaimanapun, itu secara otomatis disertakan.
Mark Reed
Ini juga berfungsi untuk membandingkan versi NPM wildcard. +1
Versi yang lebih baru tampaknya membutuhkan string untuk namanya. String kosong berfungsi dengan baik, yaituGem::Dependency.new('', '~> 1.4.5').match?('', '1.4.6beta4')
Peter Wagenet
19
classVersion<Arraydef initialize s
super(s.split('.').map {|e| e.to_i })enddef< x
(self<=> x)<0enddef> x
(self<=> x)>0enddef== x
(self<=> x)==0endend
p [Version.new('1.2')<Version.new('1.2.1')]
p [Version.new('1.2')<Version.new('1.10.1')]
Seperti beberapa jawaban lain di sini, sepertinya Anda melakukan perbandingan string dan bukan numerik, yang akan menyebabkan masalah saat membandingkan versi seperti '0,10' dan '0,4'.
John Hyland
7
Suara positif untuk solusi ringkas yang tidak memerlukan pemasangan permata.
JD.
2
Untuk apa nilainya: 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 Gumpalan kode membuatnya jelek, tetapi pada dasarnya, menggunakan ini vs Permata :: Versi sekitar dua kali lebih cepat.
Saya telah melihatnya, tetapi mengharuskan saya menggunakan 2 permata untuk melakukan hal yang sangat sederhana. Saya ingin menggunakannya sebagai pilihan terakhir.
pengguna239895
8
"Jangan menemukan kembali roda". Karena sederhana bukan berarti programmer tidak bekerja dan memikirkannya. Gunakan permata, baca kodenya, dan belajar darinya - dan lanjutkan ke hal-hal yang lebih besar dan lebih baik!
Trevoke
Manajemen ketergantungan dan pemeliharaan versi adalah masalah yang sulit, mungkin jauh lebih sulit daripada tugas membandingkan 2 versi. Saya sangat setuju bahwa memperkenalkan 2 dependensi lagi harus menjadi pilihan terakhir dalam kasus ini.
Array.class_eval {include Comparable} akan membuat semua array merespon <,>, dll. Atau, jika Anda hanya ingin melakukan ini pada array tertentu: a = [1, 2]; a.extend (Comparable)
Wayne Conrad
4
Masalah yang saya temukan dengan solusi ini adalah ia mengembalikan bahwa "1.2.0" lebih besar dari "1.2"
Maria S
9
Gem::Version adalah cara mudah untuk pergi ke sini:
Jauh lebih baik daripada versionomy yang membutuhkan ekstensi-c !?
W.Andrew Loe III
saya tidak berpikir 'max' akan bekerja .. itu akan melaporkan 0,5 lebih besar dari 0,44. Yang tidak benar saat membandingkan versi semver.
Flo Woo
2
ini tampaknya telah diperbaiki di Gem :: Version terbaru. 0,44 dilaporkan dengan benar sebagai lebih tinggi dari 0,5 sekarang.
Flo Woo
5
Jika Anda ingin melakukannya dengan tangan tanpa menggunakan permata apa pun, sesuatu seperti berikut ini akan berfungsi, meskipun kelihatannya agak buruk.
Pada dasarnya, Anda mengubah setiap string versi menjadi array bilangan bulat dan kemudian menggunakan operator perbandingan array . Anda dapat memecah langkah-langkah komponen untuk mendapatkan sesuatu yang sedikit lebih mudah diikuti jika ini masuk dalam kode yang perlu dipertahankan seseorang.
Version
kelas sederhana yang melakukan semua yang saya butuhkan: shorts.jeffkreeftmeijer.com/2014/…Jawaban:
sumber
Gem::Version...
sintaks membuat saya pikir saya akan perlu menginstal permata. Tapi itu tidak diperlukan.Gem::Dependency.new(nil, '~> 1.4.5').match?(nil, '1.4.6beta4')
require 'rubygems'
untuk mendapatkan akses keGem
namespace. Dari 1.9, bagaimanapun, itu secara otomatis disertakan.Jika Anda perlu memeriksa batasan versi pesimis , Anda dapat menggunakan Gem :: Dependency seperti ini:
sumber
Gem::Dependency.new('', '~> 1.4.5').match?('', '1.4.6beta4')
sumber
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
Gumpalan kode membuatnya jelek, tetapi pada dasarnya, menggunakan ini vs Permata :: Versi sekitar dua kali lebih cepat.Anda dapat menggunakan
Versionomy
permata (tersedia di github ):sumber
Saya akan melakukannya
Maka Anda bisa melakukannya
(dan mungkin semua perbandingan "biasa" lainnya).... dan jika Anda menginginkan tes
<
atau>
, Anda dapat melakukan misatau lakukan beberapa fungsi lainnya jika Anda ingin.
sumber
Gem::Version
adalah cara mudah untuk pergi ke sini:sumber
Jika Anda ingin melakukannya dengan tangan tanpa menggunakan permata apa pun, sesuatu seperti berikut ini akan berfungsi, meskipun kelihatannya agak buruk.
Pada dasarnya, Anda mengubah setiap string versi menjadi array bilangan bulat dan kemudian menggunakan operator perbandingan array . Anda dapat memecah langkah-langkah komponen untuk mendapatkan sesuatu yang sedikit lebih mudah diikuti jika ini masuk dalam kode yang perlu dipertahankan seseorang.
sumber
Saya memiliki masalah yang sama, saya ingin komparator versi tanpa Permata, muncul dengan ini:
sumber