RubyIntermedio20 oct 2025
¡El `return` Rebelde de Ruby: Te saca de la fiesta entera!
snippet.ruby
def search_for_waldo(people)
found_waldo = false
puts "Iniciando búsqueda en la multitud..."
people.each do |person|
if person == "Waldo"
puts "¡Eureka! ¡Encontré a Waldo! 🎉"
found_waldo = true
return "Waldo encontrado y la búsqueda se detuvo en seco." # Este return sale del método, no solo del bloque
else
puts "No es #{person}..."
end
end
puts "Fin de la búsqueda en la multitud."
return found_waldo ? "Waldo se escondió bien, pero lo encontré al final." : "Waldo no estaba en esta multitud. 🕵️♀️"
end
puts "\n--- Escenario 1: Waldo está en la lista ---"
puts search_for_waldo(["Juan", "Pedro", "Waldo", "María", "Carlos"])
puts "\n--- Escenario 2: Waldo no está en la lista ---"
puts search_for_waldo(["Ana", "Luis", "Sofía"])¿Qué crees que imprime?
✅ Salida Esperada
--- Escenario 1: Waldo está en la lista ---
Iniciando búsqueda en la multitud...
No es Juan...
No es Pedro...
¡Eureka! ¡Encontré a Waldo! 🎉
Fin de la búsqueda en la multitud.
Waldo se escondió bien, pero lo encontré al final.
--- Escenario 2: Waldo no está en la lista ---
Iniciando búsqueda en la multitud...
No es Ana...
No es Luis...
No es Sofía...
Fin de la búsqueda en la multitud.
Waldo no estaba en esta multitud. 🕵️♀️
⚠️ Salida Real
--- Escenario 1: Waldo está en la lista ---
Iniciando búsqueda en la multitud...
No es Juan...
No es Pedro...
¡Eureka! ¡Encontré a Waldo! 🎉
Waldo encontrado y la búsqueda se detuvo en seco.
--- Escenario 2: Waldo no está en la lista ---
Iniciando búsqueda en la multitud...
No es Ana...
No es Luis...
No es Sofía...
Fin de la búsqueda en la multitud.
Waldo no estaba en esta multitud. 🕵️♀️
¿Por qué pasa esto?
Aquí, el `return` dentro del bloque `each` no solo termina la iteración, ¡sino que **sale del método completo** `search_for_waldo`! 🤯
Es como si tuvieras una fiesta 🎉 y, al encontrar a tu amigo `Waldo`, gritaras "¡Lo encontré!" y te fueras de la casa, llevándote a `Waldo` contigo, sin importar quién más estuviera allí o si el anfitrión tenía algo más que decir.
En Ruby, los **bloques no introducen un nuevo ámbito de retorno**. Un `return` dentro de un bloque siempre busca el **método que lo contiene** para regresar. Esto significa que cualquier código posterior a la iteración en el método que llamó al bloque **nunca se ejecutará** si el `return` dentro del bloque se activa. ¡Sorpresa! 💥
Conceptos relacionados
control-flowblocksnon-local-return