2011-01-26 9 views
25

¿Alguien me puede explicar la diferencia entre if y unless y cuándo usarlo?Diferencia - a menos que/si

+1

'a menos que comments.empty?' Se vea mejor que 'if! Comments.empty?', Pero usándolo con una cláusula else, como: 'unless comments.empty? entonces aaa else bbb end' puede ser más confuso que el equivalente invertido: 'if comments.empty? bbb else aaa end' – Phrogz

+0

Ruby no sigue el Zen de Python: "Debería haber una, y preferiblemente solo una, forma obvia de hacerlo". –

Respuesta

44

unless es simplemente una negada if. Es decir, ejecuta lo que contiene si la condición es no verdadero.

unless foo? 
    # blabla 
end 

significa simplemente

if !foo? 
    # blabla 
end 

Es todo una cuestión de lo que se encuentra más fácil de leer, de verdad.

Consulte también: Unless, The Abused Ruby Conditional

5

unless es simplemente equivalente a if not. Cuando usa cuál es una preferencia personal.

2

La diferencia entre if y unless es que son exactamente opuestos el uno del otro:

  • if lleva a una condición, un entonces bloque y una opcional bloque else, y evalúa el bloque entonces si la condición es verdadera, de lo contrario evalúa el else-block
  • unless toma una condición, un then-block y un else-block opcional, y evalúa el then-block si th La condición de e es faly, de lo contrario evalúa el else-block

O, en otras palabras, significan más o menos lo mismo en Ruby que en inglés.

+0

El texto anterior parece engañoso dada la posibilidad de postcondiciones. (Si bien la distinción entre los dos es correcta, el resto implica que necesita un bloque 'then', y que siempre puede optar por poner un bloque' else'.) – Phrogz

7

Usar 'a menos' es sencillo para mí cuando hay un argumento, pero me resulta confuso cuando hay varios. Y cuando se usa || en lugar de &&.

"A menos que esto o aquello" es más difícil para mi cerebro. "si no es esto y no es así" es más fácil.

Va a ser más difícil mantener este código en el futuro si lo uso. Entonces yo no.