[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

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

Chuck Remes

12/4/2006 5:33:00 PM

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?

5 Answers

Robert Klemme

12/4/2006 5:37:00 PM

0

On 04.12.2006 18:33, cremes.devlist@mac.com wrote:
> 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

Stefano Crocco

12/4/2006 5:44:00 PM

0

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

Chuck Remes

12/4/2006 5:58:00 PM

0


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...

cr

Paul Lutus

12/4/2006 6:17:00 PM

0

cremes.devlist@mac.com wrote:

/ ...

> 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.

--
Paul Lutus
http://www.ara...

Hal E. Fulton

12/5/2006 12:29:00 AM

0

cremes.devlist@mac.com wrote:
>
> Sheesh! I *knew* it was something easy. I feel like a dope...
>

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