Как сравнить версии в Ruby?

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

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

114
задан AGS 3 July 2013 в 13:51
поделиться

5 ответов

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')]
19
ответ дан 24 November 2019 в 02:31
поделиться

Айв обнаружил, что с большим количеством плагинов способы защищены/приватны (т.е. в области закрытия). Если вам нужно изменить функциональность методов/функций, то вам не повезло, если вы не хотите его раскошелиться. Теперь, если вам не нужно менять какие-либо из этих методов/функций, то вы можете использовать $ .extend ($ .fn.pluginName, {/* ваши методы/свойства */};

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

Все это на самом деле сводится к тому, как плагин, который вы хотите расширить, кодируется.

-121--844076-

Невозможно. переполнение: скрытие; Скрытие содержимого вне элемента. Период.

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

ПРАВКА Вы могли бы положить какую-нибудь набивку на этот конкретный div, если вы можете жить с этой набивкой, то есть. Див тоже должен быть немного шире.

ИЗМЕНИТЬ 2 Как заявили другие, хотя положение: относительное; и положение: абсолютное; вероятно, более распространены, да, z-индекс работает с позицией: фиксировано; также, только не для положения: статический; Я их упустил из виду.

-121--2887393-

Я бы сделал

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

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

a1 <=> a2

(и, вероятно, все остальные «обычные» сравнения).

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

(a1 <=> a2) < 0

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

10
ответ дан 24 November 2019 в 02:31
поделиться

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

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

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

5
ответ дан 24 November 2019 в 02:31
поделиться

Вы можете использовать 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
15
ответ дан 24 November 2019 в 02:31
поделиться
Gem::Version.new('0.4.1') > Gem::Version.new('0.10.1')
218
ответ дан 24 November 2019 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: