Dominar los ciclos de repetición es fundamental para escribir código eficiente en Ruby. Desde el clásico while hasta herramientas exclusivas del lenguaje como times y each, Ruby ofrece una sintaxis clara y amigable que permite resolver problemas iterativos con pocas líneas de código. A continuación se explican las distintas formas de crear loops, junto con auxiliares como next, redo y retry que controlan el flujo dentro de cada iteración.
¿Cómo funciona el while y su alternativa con times?
El while en Ruby funciona de manera familiar: se inicializa una variable, se establece una condición y dentro del bloque se ejecuta la lógica hasta que la condición deje de cumplirse [0:10]. Por ejemplo, con una variable en cero que se incrementa en uno hasta ser menor a 10, se obtiene la impresión de cada valor en cada vuelta del ciclo.
Sin embargo, Ruby cuenta con un auxiliar llamado times que simplifica esta misma tarea [1:02]. En lugar de declarar una variable externa e incrementarla manualmente, se escribe 10.times do |num| y la variable num almacena automáticamente el número de iteración actual. El resultado es idéntico al while, pero con una declaración pura de Ruby que no depende de sintaxis compartida con otros lenguajes [1:42].
- while requiere inicializar y modificar la variable manualmente.
- times gestiona el contador de forma interna.
- Ambos producen el mismo resultado, pero times resulta más eficiente en escritura.
¿Qué diferencia hay entre until, for y each?
¿Cómo opera until en Ruby?
El until ejecuta un bloque de código hasta que una condición se cumpla, es decir, funciona de forma inversa al while [2:15]. Si se declara una variable i en cero y se indica until i > 5, el ciclo se detiene justo cuando i alcanza el valor cinco. Es útil cuando resulta más natural expresar cuándo debe detenerse el ciclo en lugar de cuándo debe continuar.
¿Cuáles son las dos formas de escribir un for?
Ruby permite declarar un for de dos maneras [2:50]:
- Forma clásica:
for i in 0..5 itera sobre un rango e imprime cada valor.
- Forma con each:
(0..5).each do |i| hace exactamente lo mismo, pero utiliza el método each sobre el rango.
La diferencia práctica es que each es el método preferido para trabajar con objetos en Ruby [3:40]. Es la forma que se utiliza con mayor frecuencia en el desarrollo real, ya que se integra de forma natural con arreglos, hashes y otros objetos iterables.
¿Qué hacen next, redo y retry dentro de los loops?
Ruby incluye auxiliares que modifican el comportamiento del flujo dentro de un ciclo.
¿Cuándo usar next?
El next salta a la siguiente iteración sin ejecutar el código restante del bloque [4:15]. Por ejemplo, dentro de un for del uno al cinco, si se indica next if i < 2, las iteraciones donde i sea menor a dos se omiten y solo se ejecuta el código a partir del valor dos.
¿Por qué redo y retry pueden generar ciclos infinitos?
El redo reinicia la iteración actual sin evaluar la condición del ciclo [5:00]. Esto significa que si la condición que dispara el redo se cumple desde el inicio, el loop se ejecuta infinitamente. Es importante tener precaución con este auxiliar.
El retry se utiliza principalmente dentro de bloques de excepciones con begin y rescue [5:50]. Al capturar un error con rescue y aplicar retry, el bloque completo se vuelve a ejecutar desde begin. Si la condición que genera la excepción persiste, también produce un ciclo infinito.
ruby
10.times do |i|
begin
puts i
raise if i > 2
rescue
retry
end
end
En este ejemplo, cuando i supera el valor dos se lanza una excepción, el rescue ejecuta retry y el bloque se reinicia indefinidamente [6:20].
- next: avanza a la siguiente iteración.
- redo: reinicia la iteración actual ignorando la condición.
- retry: reinicia el bloque completo, ideal para manejo de excepciones.
Si un loop se repite de forma infinita, basta con presionar Ctrl+C para interrumpir la ejecución sin mayor problema [7:10]. Conocer estos auxiliares abre el panorama para construir ciclos más robustos y manejar situaciones de error de manera controlada.