Use of case statement doesn't work as I expect :( help appreciated!

Hi all,

I have an object ( a website tester) that can return various values.
One of which is Net:HTTPOK, I want to use a case statement to evaluate
this and set a variable called ‘severity’, as follows:

result = TestWebsite::test( site )
case result
when Net::HTTPOK
severity = :INFO
when SocketError
severity = :ERROR
severity = :WARN

However, when Net::HTTPOK is returned, the severity variable ALWAYS
ends up as :WARN instead of :INFO.

Using IRB I have manually entered the code in as follows:

site = ‘
=> “
result = TestWebsite::test( site )
=> Net::HTTPOK

Then ran the following tests:

result == Net::HTTPOK
=> true
result != Net::HTTPOK
=> false

This to me just proves the result I am getting is Net::HTTPOK, but why
can’t I get it to match in the case statement?

Many thanks for any help


On 11/1/07, Gabriel D. [email protected] wrote:

when SocketError
severity = :ERROR
severity = :WARN

This form of case
case x
when y

is logically equivalent to:

if y === x

Now Net::HTTPOK is a class, and class implements === as a test of
whether the argument is an instance of the class or a subclass.

Array === [] #=> true
Array === Array #=> false

If response is really the class then you either want to use if/elsif or

when result == Net::HTTPOK

Rick DeNatale

My blog on Ruby

I think you problem is in your code the case is testing if

result.is_a? Net::HTTPOK

and not

result == Net::HTTPOK

This happens since Net::HTTPOK is a class and not an object

If you rewrite your code this way you should see the behaviour you’re

result = TestWebsite::test( site )

case result.to_s
when ‘Net::HTTPOK’
severity = :INFO
when ‘SocketError’
severity = :ERROR
severity = :WARN

A better idea would be to have TestWebsite::test( site ) returning the
object and not the class, this way you don’t need to rewrite your
original case code