2011-10-19 2 views
8

Nel blocco IF è necessario verificare se alcune condizioni sono vere e, in tal caso, uscire dal blocco.Ruby - uscita dal blocco IF

#something like this 
if 1 == 1 
    return if some_object && some_object.property 
    puts 'hello' 
end 

Come posso farlo?

risposta

12

Non si può rompere fuori da un if così. Che cosa si può fare è aggiungere un sub-clausola ad esso:

if (cond1) 
    unless (cond2) 
    # ... 
    end 
end 

Se hai problemi con la logica di essere troppo nidificato e avete bisogno di un modo per appiattire fuori meglio, forse quello che si vuole fare è calcolare una variabile prima di mano e poi immergersi solo in se è necessario:

will_do_stuff = cond1 
will_do_stuff &&= !(some_object && some_object.property) 

if (will_do_stuff) 
    # ... 
end 

C'è un certo numero di modi per evitare di avere una struttura profondamente annidata senza dover break esso.

+2

+1 per calcolare preventivamente una variabile, che dà un nome alla condizione. Un buon nome migliorerà notevolmente la leggibilità. –

+0

Consiglierei di evitare questo e definire più metodi se necessario. Questo è lo schema che Rails utilizza e funziona molto bene. Suddividi i metodi per fare la cosa più atomica con cui puoi convivere - in questo caso, un altro metodo (privato?) Nella stessa classe/oggetto può essere usato per testare questa condizione. Per esempio. 'def will_parse? (obj); ! Obj.nil? && obj.respond_to? (: parse) && obj.is_ready_and_willing ?; fine' – coreyward

+0

Che cos'è "&& ="? –

2

Fai attenzione quando scegli le parole che associ alle cose. Poiché Ruby ha blocchi, non sono sicuro che tu abbia l'impressione che un'istruzione condizionale sia un blocco. Non si può, ad esempio, effettuare le seguenti operazioni:

# will NOT work: 
block = Proc.new { puts "Hello, world." } 
if true then block 

Se avete bisogno di avere un condizionale nidificato, si può fare proprio questo, senza complicare le cose: nessun

if condition_one? 
    if condition_two? 
    # do some stuff 
    end 
else 
    # do something else 
end 
+0

Questo è un po 'fuorviante, perché se hai cambiato la seconda riga del primo snippet in "se true poi block.call end' allora funzionerebbe – DaveMongoose

+0

@DaveMongoose Questo perché stai chiamando il metodo" call "su un Istanza di Proc, ma grazie per il downvote – coreyward

+0

c'è un esempio di contatore di qualcosa in ruby ​​che è un blocco ma può essere sostituito con un'istanza di proc (come 'block')? Penso che la sintassi richiede che sia '& block' se lo stai usando al posto di un blocco esplicito. – DaveMongoose