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
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
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
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.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.