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