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

Discussion in 'Ruby' started by gabe, Nov 1, 2007.

  1. gabe

    gabe Guest

    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
     
    gabe, Nov 1, 2007
    #1
    1. Advertisements

  2. gabe

    dblack Guest

    Hi --

    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!
     
    dblack, Nov 1, 2007
    #2
    1. Advertisements

  3. gabe

    gwtmp01 Guest

    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
     
    gwtmp01, Nov 1, 2007
    #3
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.