2013-06-26 12 views
6

to zabrzmi dziwnie, ale chciałbym zrobić coś takiego:Ruby case statement na haszyszu?

case cool_hash 
    when cool_hash[:target] == "bullseye" then do_something_awesome 
    when cool_hash[:target] == "2 pointer" then do_something_less_awesome 
    when cool_hash[:crazy_option] == true then unleash_the_crazy_stuff 
    else raise "Hell" 
end 

Idealnie, nie trzeba nawet odwoływać się ponownie, ponieważ to, co jest o case. Gdybym tylko chciał skorzystać z jednej opcji, użyłbym "case cool_hash [: that_option]", ale chciałbym użyć dowolnej liczby opcji. Ponadto wiem, że instrukcje case w Ruby oceniają tylko pierwszy prawdziwy blok warunkowy, czy istnieje sposób na przesłonięcie tego, aby ocenić każdy blok, który jest prawdziwy, chyba że wystąpi przerwa?

Odpowiedz

3

Twój kod jest bardzo blisko ważnego kodu ruby. Wystarczy usunąć nazwę zmiennej w pierwszej linii, zmieniając to być:

case 

Jednakże, nie ma sposobu, aby zastąpić oświadczenie case ocenić wiele bloków. Myślę, że chcesz użyć instrukcji if. Zamiast break używasz return, aby wyskoczyć z metody.

def do_stuff(cool_hash) 
    did_stuff = false 

    if cool_hash[:target] == "bullseye" 
    do_something_awesome 
    did_stuff = true 
    end 

    if cool_hash[:target] == "2 pointer" 
    do_something_less_awesome 
    return # for example 
    end 

    if cool_hash[:crazy_option] == true 
    unleash_the_crazy_stuff 
    did_stuff = true 
    end 

    raise "hell" unless did_stuff 
end 
+0

dziękuję za szybką odpowiedź! Mile widziane. Pomaga mi to i mam nadzieję, że z czasem będę myślał w Ruby. –

4

Myślę, że podążanie jest lepszym sposobem na zrobienie tego, co chcesz.

def do_awesome_stuff(cool_hash) 
    case cool_hash[:target] 
    when "bullseye" 
     do_something_awesome 
    when "2 pointer" 
     do_something_less_awesome 
    else 
    if cool_hash[:crazy_option] 
     unleash_the_crazy_stuff 
    else 
     raise "Hell" 
    end 
    end 
end 

Nawet w inny części futerału można użyć „case cool_hash [: crazy_option]” zamiast „czy” jeśli istnieje kilka warunków. Wolę używać w tym przypadku wyrażenia "jeśli", ponieważ istnieje tylko jeden warunek.

12

Można również użyć lambda:

case cool_hash 
when -> (h) { h[:key] == 'something' } 
    puts 'something' 
else 
    puts 'something else' 
end 
+0

dokładnie tego, czego szukałem! – Yonk