2011-10-19 14 views
8

En el bloque IF, necesito verificar si alguna condición es verdadera y si lo hace, salir del bloque.Ruby - salir del bloque IF

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

¿Cómo puedo hacerlo?

Respuesta

12

No se puede romper de un if así. Lo que puede hacer es añadir una subcláusula a ella:

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

Si usted está teniendo problemas con su lógica de ser demasiado anidada y que necesita una manera de aplanarlo mejor, tal vez lo que desea hacer es calcular una variable antes de la mano y sólo sumergirse en si es necesario:

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

if (will_do_stuff) 
    # ... 
end 

Hay un número de maneras de evitar que tenga una estructura anidada sin tener que break ella.

+2

+1 para calcular una variable de antemano, que le da un nombre a la condición. Un buen nombre mejorará enormemente la legibilidad. –

+0

Recomiendo evitar esto y definir más métodos si es necesario. Este es el patrón que usa Rails y funciona muy bien. Divida los métodos para hacer la cosa más atómica con la que pueda vivir; en este caso, otro método (privado) en la misma clase/objeto se puede usar para probar esta condición. P.ej. 'def will_parse? (obj); ! obj.nil? && obj.respond_to? (: parse) && obj.is_ready_and_willing ?; end' – coreyward

+0

¿Qué es "&& ="? –

2

Tenga cuidado al elegir las palabras que asocia con las cosas. Debido a que Ruby tiene bloques, no estoy seguro de si tiene la impresión de que un enunciado condicional es un bloque. No se puede, por ejemplo, hacer lo siguiente:

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

Si usted necesita tener un condicional anidada, se puede hacer eso sin complicar las cosas: ningún

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

Esto es un poco engañoso, porque si cambiaras la segunda línea del primer fragmento a 'if true then block.call end' entonces funcionaría – DaveMongoose

+0

@DaveMongoose Eso es porque estás llamando al método 'call' en un Proc instancia, pero gracias por el downvote – coreyward

+0

¿hay un ejemplo de contador de algo en ruby ​​que es un bloque pero puede ser sustituido por una instancia de proceso (como 'block')? Creo que la sintaxis requiere que sea '& block' si lo estás usando en lugar de un bloque explícito. – DaveMongoose

Cuestiones relacionadas