Forum: Ruby comparison operations in case statements

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
47b1910084592eb77a032bc7d8d1a84e?d=identicon&s=25 Joel VanderWerf (Guest)
on 2006-01-14 21:01
(Received via mailing list)
This looks kind of cute, as a way to mix class-matching tests with
comparison operator tests in case statements. Too bad it's not really
practical (the commented out caching may help a bit, but may also use
too much memory):

class Comparator < Proc
  def ===(val)
    call val
  end

  def &(other)
    compare do |val|
      self[val] and other[val]
    end
  end
end

def compare
  Comparator.new
end

class Numeric
  #@comparator_lt = {}
  def self.<(x)
    #@comparator_lt[x] ||=
    compare do |val|
      self === val and val < x
    end
  end

  #@comparator_gt = {}
  def self.>(x)
    #@comparator_gt[x] ||=
    compare do |val|
      self === val and val > x
    end
  end
end


raise unless (Numeric < 6) === 3
raise if (Integer < 6) === 2.3
raise if (Integer < 6) === "foo"

case 3
when (Numeric < 6) & (Numeric > 5); raise
when (Numeric < 0) & (Numeric > -10); raise
when (Numeric < 6) & (Numeric > 2)
else raise
end
E34b5cae57e0dd170114dba444e37852?d=identicon&s=25 Logan Capaldo (Guest)
on 2006-01-14 22:34
(Received via mailing list)
On Jan 14, 2006, at 3:00 PM, Joel VanderWerf wrote:

>
>
>   def self.>(x)
> raise if (Integer < 6) === "foo"
>
Neat. Seems a little redundant though

raise unless Numeric === 3
case
when 3 < 6 and 3 > 5; raise
when 3 < 0 and 3 > -10; raise
when 3 < 6 and 3 > 2
else raise
end

I'm presuming nine times out of ten the variable you'll run these
tests on will have less characters than Numeric for instance.

eg:
x = 3
raise unless Numeric === x
case
when x > 2; ...
end
This topic is locked and can not be replied to.