2011-01-26 9 views
25

Qualcuno può spiegarmi la differenza tra if e unless e quando usarlo?Differenza - a meno che/se

+1

'a meno che commenti.empty?' Appaia più carino di 'if! Comments.empty?', Ma lo utilizza con una clausola else, come: 'unless comments.empty? allora aaa else bbb end' potrebbe essere più confuso dell'equivalente invertito: 'if comments.empty? bbb else aaa end' – Phrogz

+0

Ruby non segue lo Zen di Python: "Ci dovrebbe essere uno - e preferibilmente solo un modo - ovvio per farlo". –

risposta

44

unless è solo un negato. Cioè, esegue qualunque cosa contenga se la condizione è non true.

unless foo? 
    # blabla 
end 

significa semplicemente

if !foo? 
    # blabla 
end 

E 'tutta una questione di ciò che si trova più facile da leggere, davvero.

Vedi anche: Unless, The Abused Ruby Conditional

5

unless è semplicemente equivalente a if not. Quando usi quale è una preferenza personale.

2

La differenza tra if e unless è che sono esatti opposti l'uno dall'altro:

  • if prende una condizione, un allora blocco e un altro blocco opzionale, e valuta l'allora blocco se la condizione è veritiera, altrimenti valuta il blocco else
  • unless accetta una condizione, un blocco di blocco e un blocco di altro opzionale e valuta il blocco di se La condizione è falsa, altrimenti valuta il blocco else

O, in altre parole: significano praticamente la stessa cosa in Ruby come in inglese.

+0

Il tuo testo sopra sembra fuorviante data la possibilità di post condizionali. (Mentre la distinzione tra i due è corretta, il resto implica che hai bisogno di un blocco 'then', e che potresti sempre scegliere di mettere un blocco' else'.) – Phrogz

7

Utilizzare "a meno che" non sia semplice per me quando c'è un argomento, ma trovo confuso quando ce ne sono diversi. E quando si utilizza || anziché &&.

"A meno che questo o quello" sia solo più difficile per il mio cervello. "se non questo e non quello" è più facile.

Sarà difficile mantenere questo codice in futuro se lo utilizzo. Quindi non lo faccio.