[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

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

Gabriel Dragffy

11/1/2007 3:58:00 PM

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
else
severity = :WARN
end

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 = 'beautyandthebrand.co.uk'
=> "beautyandthebrand.co.uk"
>> 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

Gabriel

2 Answers

Rick DeNatale

11/1/2007 4:18:00 PM

0

On 11/1/07, Gabriel Dragffy <gabe@dragffy.com> wrote:
> 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
> else
> severity = :WARN
> end

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

case
when result == Net::HTTPOK
...


--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denh...

Paolo Negri

11/1/2007 4:24:00 PM

0

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

result = TestWebsite::test( site )

case result.to_s
when 'Net::HTTPOK'
severity = :INFO
when 'SocketError'
severity = :ERROR
else
severity = :WARN
end

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

Paolo

On 01/11/2007, Gabriel Dragffy <gabe@dragffy.com> wrote:
> 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
> else
> severity = :WARN
> end
>
> 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 = 'beautyandthebrand.co.uk'
> => "beautyandthebrand.co.uk"
> >> 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
>
> Gabriel
>
>