2010-03-25 13 views
65

si quería hacer algo como esto:¿Cómo puedo devolver algo temprano desde un bloque?

collection.each do |i| 
    return nil if i == 3 

    ..many lines of code here.. 
end 

¿Cómo voy a conseguir ese efecto? Sé que podría simplemente envolver todo dentro del bloque en una gran declaración if, pero me gustaría evitar el anidamiento si es posible.

El descanso no funcionaría aquí, porque lo hago no quiero detener la iteración de los elementos restantes.

Respuesta

132

next dentro de un bloque vuelve del bloque. break dentro de un bloque regresa de la función que cedió al bloque. Para each esto significa que break sale del bucle y next salta a la siguiente iteración del bucle (de ahí el nombre). Puede devolver valores con next value y break value.

+1

'next' era lo que estaba buscando, gracias. – ryeguy

+32

+1 para el 'próximo valor' y' valor de corte'. Exactamente lo que estaba buscando. –

+1

'valor de corte' no funcionó para mí, mientras que' next value' funcionó bien. Muchas gracias. –

5

En este caso, se puede usar break para terminar el bucle principios:

collection.each do |i| 
    break if i == 3 
    ...many lines 
end 

... por supuesto, esto es suponiendo que usted no está realmente buscando para devolver un valor, simplemente salir de el bloque.

+0

Esto no solo regresaría del bloque, sino que regresaría de cada uno. Entonces el ciclo finalizaría, no continuaría con el siguiente valor. No estoy seguro de que eso sea lo que se pretendía. – sepp2k

+3

Se puede utilizar un valor con 'break' en Ruby -' romper 5 '' hará que each' para volver 5. – Chuck

+1

Gracias, pero no quiero dejar de iteración. – ryeguy

8
#!/usr/bin/ruby 

collection = [1, 2, 3, 4, 5 ] 

stopped_at = collection.each do |i| 
    break i if i == 3 

    puts "Processed #{i}" 
end 

puts "Stopped at and did not process #{stopped_at}" 
+0

Gracias @jd, funciona bien con reducir también. – Joe

Cuestiones relacionadas