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