Skip to content
No description or website provided.
Ruby
Find file
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
lib
spec
README.markdown

README.markdown

This provides a module which you can mix into any class to get chainable compare properties:

class String
  include ChainablyComparable
end

def pick_line(name)
  if "A" < name < "M"
    "Line a"
  else
    "Line b"
  end
end

puts pick_line("Yehuda")
puts pick_line("Evan")

This works by overriding the <, >, <=, and >= operators on the class in question, as well as in FalseClass. I probably wouldn't override built-in classes this way without thinking pretty hard about the consequences.

This works if you don't need to define your own comparison methods (i.e. your class inherits from a superclass that defines them). Otherwise, you can define <=> as usual:

class Version
  include ChainablyComparable

  attr_accessor :version

  def initialize(version)
    @version = version.split(".").map {|segment| segment.to_i }
  end

  def <=>(other)
    a, b = normalize(@version, other.version)
    a <=> b
  end

private
  def normalize(a, b)
    if a.size > b.size
      [a.dup, b.dup.fill(0, a.size - 1, a.size - b.size)]
    else
      [a.dup.fill(0, b.size - 1, b.size - a.size), b.dup]
    end
  end
end

version = Version.new("2.0")
Version.new("1.0.0") < version < Version.new("3")
Something went wrong with that request. Please try again.