Help, my 'case/when' code doesn't work

I've been using ruby for several months now so imagine my surprise when I wrote something using the 'case' construct and I discovered that I didn't understand how to use it! What's worse is that even after looking through the Pickaxe and some code "in the wild" that uses 'case' I still don't see what I'm doing wrong.

Here's the code in question:

def case_test(obj)
  print "testing via case... "
  case obj.class
  when Array
    puts "obj is a #{obj.class}"
  when String
    puts "obj is a #{obj.class}"
  else
    puts "obj is unknown: #{obj.class}"
  end
end

def if_test(obj)
  print "testing via if... "
  klass = obj.class
  if klass == Array
    puts "obj is a #{klass}"
  elsif klass == String
    puts "obj is a #{klass}"
  else
    puts "obj is unknown: #{obj.class}"
  end
end

case_test(Array.new)
if_test(Array.new)
case_test(String.new)
if_test(String.new)
case_test(Hash.new)
if_test(Hash.new)
cremes$ ruby a.rb
testing via case... obj is unknown: Array
testing via if... obj is a Array
testing via case... obj is unknown: String
testing via if... obj is a String
testing via case... obj is unknown: Hash
testing via if... obj is unknown: Hash

What am I doing wrong here?

I've been using ruby for several months now so imagine my surprise when I wrote something using the 'case' construct and I discovered that I didn't understand how to use it! What's worse is that even after looking through the Pickaxe and some code "in the wild" that uses 'case' I still don't see what I'm doing wrong.

Here's the code in question:

def case_test(obj)
  print "testing via case... "
  case obj.class

Make that "case obj" instead.

  when Array
    puts "obj is a #{obj.class}"
  when String
    puts "obj is a #{obj.class}"
  else
    puts "obj is unknown: #{obj.class}"
  end
end

def if_test(obj)
  print "testing via if... "
  klass = obj.class
  if klass == Array
    puts "obj is a #{klass}"
  elsif klass == String
    puts "obj is a #{klass}"
  else
    puts "obj is unknown: #{obj.class}"
  end
end

case_test(Array.new)
if_test(Array.new)
case_test(String.new)
if_test(String.new)
case_test(Hash.new)
if_test(Hash.new)
cremes$ ruby a.rb
testing via case... obj is unknown: Array
testing via if... obj is a Array
testing via case... obj is unknown: String
testing via if... obj is a String
testing via case... obj is unknown: Hash
testing via if... obj is unknown: Hash

What am I doing wrong here?

  robert

···

On 04.12.2006 18:33, cremes.devlist@mac.com wrote:

Alle 18:33, lunedì 4 dicembre 2006, cremes.devlist@mac.com ha scritto:

def case_test(obj)
  print "testing via case... "
  case obj.class
  when Array
    puts "obj is a #{obj.class}"
  when String
    puts "obj is a #{obj.class}"
  else
    puts "obj is unknown: #{obj.class}"
  end
end

Your code will call Array===obj.class. According to ri aClass===anObject
returns true if anObject is an instance of aClass or of one of its
descentents (which more or less means if anObject.is_a?(aClass) returns
true). Because of this, all your 'when' statements will fail, because
obj.class is not an instance of Array or String. To do what you want, you
should substitute

  case obj.class

with

  case obj

Stefano

Sheesh! I *knew* it was something easy. I feel like a dope...

cr

···

On Monday, December 04, 2006, at 11:44AM, "Stefano Crocco" <stefano.crocco@alice.it> wrote:

Alle 18:33, lunedì 4 dicembre 2006, cremes.devlist@mac.com ha scritto:

def case_test(obj)
  print "testing via case... "
  case obj.class
  when Array
    puts "obj is a #{obj.class}"
  when String
    puts "obj is a #{obj.class}"
  else
    puts "obj is unknown: #{obj.class}"
  end
end

Your code will call Array===obj.class. According to ri aClass===anObject
returns true if anObject is an instance of aClass or of one of its
descentents (which more or less means if anObject.is_a?(aClass) returns
true). Because of this, all your 'when' statements will fail, because
obj.class is not an instance of Array or String. To do what you want, you
should substitute

case obj.class

with

case obj

/ ...

Sheesh! I *knew* it was something easy. I feel like a dope...

Perhaps, but in point of fact, you are not a dope. You asked the right
question and got the right answer. A person who can't ask any questions for
fear of appearing to be a dope, really does end up a a dope, a
self-fulfilling prophecy.

Your self-fulfilling prophecy is that you will learn anything you want to,
because you care more about learning things than about hiding what you
don't know.

Diagnosis: not a dope.

···

cremes.devlist@mac.com wrote:

--
Paul Lutus
http://www.arachnoid.com

Don't feel like a dope. That is fairly subtle.

Consider this code:

   x = foo
   y = foo

   case x
     when y
       puts "yes"
     else
       puts "no"
   end

When would you ever expect this to print "no"?

In most cases, it will print yes. If foo is a class,
it will print no.

Hal

···

cremes.devlist@mac.com wrote:

Sheesh! I *knew* it was something easy. I feel like a dope...