|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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 Gabriel |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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.denhaven2.com/ |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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 > > Gabriel > > |
|
![]() |
| Outils de la discussion | |
|
|