2013-06-26 22 views
6

Questo sta per sembrare strano, ma mi piacerebbe fare qualcosa di simile:Dichiarazione di caso rubino su un hash?

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 

Idealmente, non avrei nemmeno bisogno di fare riferimento al ha nuovamente dato che è quello che l'istruzione case è di circa. Se volessi usare solo un'opzione, avrei "caso cool_hash [: that_option]", ma mi piacerebbe usare un numero qualsiasi di opzioni. Inoltre, so che le dichiarazioni dei casi in Ruby valuteranno solo il primo blocco condizionale vero, c'è un modo per sovrascrivere questo per valutare ogni blocco che è vero a meno che non ci sia un'interruzione?

risposta

3

Il codice è molto vicino ad essere un codice rubino valido. Basta togliere il nome della variabile nella prima riga, cambiando di essere:

case 

Tuttavia, non v'è alcun modo per ignorare l'istruzione case per valutare più blocchi. Penso che quello che vuoi è usare le dichiarazioni if. Invece di un break, si usa return per saltare fuori dal metodo.

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

Grazie mille per la risposta veloce! Molto apprezzato. Questo aiuta e spero che nel tempo penserò in Ruby. –

4

Penso che seguire sia il modo migliore di fare ciò che si desidera.

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 

Anche nella parte altro caso è possibile utilizzare 'caso cool_hash [: crazy_option]' invece di 'se' se ci sono più le condizioni. Preferisco che tu usassi 'if' in questo caso perché c'è una sola condizione.

12

Si potrebbe anche usare un lambda:

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

esattamente quello che stavo cercando! – Yonk