比较两个版本字符串时,to_f不起作用:

 > "1.5.8".to_f > "1.5.7".to_f
  => false

字符串比较更好,但并不总是正确的:
 > "1.5.8" > "1.5.7"
  => true

 > "1.5.8" > "1.5.9"
  => false

 > "1.5.8" > "1.5.10" # oops!
  => true

如何正确比较版本字符串?

最佳答案

一个想法:创建一个Object#compare_by方法,它的行为类似于compare(也称为spaceship operatorObject#<=>),但接受一个自定义块:

class Object
  def compare_by(other)
    yield(self) <=> yield(other)
  end
end

>> "1.5.2".compare_by("1.5.7") { |s| s.split(".").map(&:to_i) }
#=> -1

您还可以根据compare方法采取更具体的方法:
class String
  def compare_by_fields(other, fieldsep = ".")
    cmp = proc { |s| s.split(fieldsep).map(&:to_i) }
    cmp.call(self) <=> cmp.call(other)
  end
end

>> "1.5.8".compare_by_fields("1.5.8")
#=> 0

关于ruby - 如何找到更大的版本号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12191435/

10-15 19:44