use of case statement doesn't work as I expected, what am I doingwrong?

G

gabe

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:=> Net::HTTPOK

Then ran the following tests:=> 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
 
D

dblack

Hi --

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:
=> Net::HTTPOK

Then ran the following tests:
=> 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?

The test that the case statement is running is this:

Net::HTTPOK === result # note the order, and the 3 equal signs

I don't know exactly what Net::HTTPOK is, or how it handles ===, but
evidentally it doesn't consider itself "threequal" to result.


David

--
Upcoming training by David A. Black/Ruby Power and Light, LLC:
* Advancing With Rails, Edison, NJ, November 6-9
* Advancing With Rails, Berlin, Germany, November 19-22
* Intro to Rails, London, UK, December 3-6 (by Skills Matter)
See http://www.rubypal.com for details!
 
G

gwtmp01

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.

There are two issues:

1) case uses the === operator and not ==

This means that the comparisons in your case statement are:

Net::HTTPOK === result
SocketError === result

2) Class#=== doesn't test for equality. It checks to see if
the argument is an instance of the class, which is not
true in your case, Net::HTTPOK is not an instance of itself.

Just to be clear, Net::HTTPOK and SocketError are class objects
(instances of Class) and so they use Class#=== in case statements.

You could rewrite your case as an if/then/else or use the alternate
form of the case statement:

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

There of course lots of other possibilities:

severity_map = Hash.new:)WARN).merge(Net::HTTPOK => :INFO,
SocketError => :ERROR)

severity = severity_map[TestWebsite::test(site)]

Gary Wright
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top