Un bucle es una estructura de control que permite ejecutar código repetidamente en función de una condición dada.
Un bucle while es una estructura de control que permite ejecutar código repetidamente en función de una condición dada. El código que hay dentro de un bucle while se seguirá ejecutando mientras la condición se evalúe como verdadera. Los bucles while se usan a menudo cuando el número de iteraciones se desconoce de antemano, pero pueden usarse en cualquier situación en la que se necesite un bucle.
La condición se evalúa antes de ejecutar el código que hay dentro del bucle, lo que significa que, si la condición es falsa, el código del bucle no se ejecutará nunca.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Cuando quieras iterar sobre un string, puedes recorrer la longitud del string con un bucle.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
Los bucles until funcionan igual que los bucles while, salvo que el código que hay dentro del bucle se seguirá ejecutando hasta que la condición se evalúe como verdadera.
Es la misma diferencia que hay entre if y unless.
i = 0
until i == 3
puts i
i += 1
end
Un error habitual con los bucles while es entrar en un «bucle infinito», del que nunca se sale. Un bucle infinito puede deberse a que una condición nunca se evalúe como verdadera o falsa. A menudo se debe a un error de programación; por ejemplo, olvidarse de incrementar la variable del bucle. Pero a veces un bucle infinito es la forma más clara de implementar la lógica del programa. O puede ser imprescindible repetir el bucle para siempre; por ejemplo, un servidor HTTP espera una conexión entrante, la atiende y después espera la siguiente conexión.
La palabra clave break puede usarse para salir de un bucle antes de tiempo.
Puede resultar cómodo cuando quieres salir de un bucle antes de tiempo bajo ciertas condiciones.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
La palabra clave next puede usarse para saltar a la siguiente iteración de un bucle.
Puede resultar cómodo cuando quieres saltarte iteraciones concretas de un bucle.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
El tipo de la variable puede ser distinto durante el bucle.
En el siguiente ejemplo, el tipo de a es Int32 | String porque puede ser Int32 o String en la primera parte del bucle.
La variable a solo tendrá el tipo Int32 | String en la primera parte del bucle, ya que cuando el bucle empieza contiene Int32 y, en la segunda iteración, contiene un String.
Este sistema de tipos múltiples se explicará en detalle más adelante.
Pero como tenemos la certeza de que la segunda parte del bucle solo contendrá String, el tipo de a es String en la segunda parte del bucle.
En tiempo de ejecución, nunca contendrá Int32 y String al mismo tiempo.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
While puede usarse como expresión, lo que significa que puede usarse como el valor de una variable.
El valor que se devuelve es el valor que se indica con la palabra clave break.
No devolverá el valor de la última expresión del bucle.
a = while true
break 1
end
p a
# => 1
i = 0
a = while i == 0
i += 1
1
end
p a
# => nil