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?

On 04.12.2006 18:33, [email protected] 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.

print "testing via if… "
case_test(Array.new)
testing via case… obj is unknown: Hash
testing via if… obj is unknown: Hash

What am I doing wrong here?

robert

Alle 18:33, lunedì 4 dicembre 2006, [email protected] ha scritto:

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

On Monday, December 04, 2006, at 11:44AM, “Stefano C.”
[email protected] wrote:

end

with

case obj

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

cr

[email protected] 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

[email protected] 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.