in Hacking

A ruby idea

In ruby you can check ranges via de 'range' language construct. For example: (12..23).include?( value).
But how about chaining '<', '<=', '=>' and '>' operators.

For example. currently in Ruby I must write the following

if 10 < x && x < 15
  # code
end

Why isn't it possible to write

if 10 < x < 15
  # code
end

Well in fact it is possible with some hacks :)
The example below is only valid for Fixnum, but it describes the possibilities:

The hack is to just simply return the right hand. In Ruby this shouldn't be a problem, because every object/values is true except false and nil.

class Fixnum
  def <(val)
    super ? val : false
  end
  def <=(val)
    super ? val : false
  end
  def >(val)
    super ? val : false
  end
  def >=(val)
    super ? val : false
  end
end

To make this work the FalseClass should also support these operators, and simply return false to make the complete expression return false if one of them fails:


class FalseClass
  def <(val)
    false
  end
  alias :<= :<
  alias :> :<
  alias :>= :< 
end

So 10 < x just returns 'x' on succes and returns false on error. [code language="ruby"] if 10 < x < 15 # code end [/code] I'm wondering what could/would be the 'problem' by using this construct? Is there a specific reason this has not been implemented this way? BTW: just found a 'nice' implementation for this construct on: http://refactormycode.com/codes/1284-chained-comparisons-in-ruby

[:<, :>, :<=, :>=].each do |operator|
  [Float, Fixnum, Comparable].each do |klass| 
    klass.class_eval {
      alias_method("__#{operator}__", operator)
      define_method(operator) do |operand|
        send("__#{operator}__", operand) and operand
      end 
    }
  end
  FalseClass.send(:define_method, operator) { false }
end