Un bucle es una estructura de control que permite ejecutar código repetidamente según una condición dada.
Un bucle while es una estructura de control que permite ejecutar código repetidamente según una condición dada. El código dentro de un bucle while se seguirá ejecutando mientras la condición se evalúe como verdadera. Los bucles while se suelen usar cuando no se conoce de antemano el número de iteraciones, 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 está dentro del bucle, lo que significa que si la condición es falsa, el código del bucle nunca se ejecutará.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Cuando quieras recorrer un string, puedes iterar sobre la longitud del string.
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 dentro del bucle se seguirá ejecutando hasta que la condición se evalúe como verdadera.
Es lo mismo que la diferencia entre if y unless.
i = 0
until i == 3
puts i
i += 1
end
Un error común con los bucles while es entrar en un «bucle infinito», que nunca termina. 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 del programador; por ejemplo, olvidar 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 es vital repetir el bucle para siempre; por ejemplo, un servidor HTTP espera una conexión entrante, la atiende y luego espera la siguiente conexión.
La palabra clave break se puede usar para salir de un bucle antes de tiempo.
Esto 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 se puede usar para saltar a la siguiente iteración de un bucle.
Esto puede resultar cómodo cuando quieres saltarte iteraciones específicas 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 diferente dentro de un 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 comienza contiene un 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á un 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
En Crystal, la última expresión de un método devuelve su valor.
Sin embargo, a veces necesitas devolver un valor antes de la última expresión.
Para eso puedes usar la palabra clave return, que devolverá el valor de la expresión que le sigue.
El código que se escriba después de la palabra clave return no se ejecutará.
def speed_limit(road_number)
if road_number == 1
return 50
puts "This will not be executed"
elsif road_number == 2
return 80
puts "This will not be executed"
end
100
end
p speed_limit(1) # => 50
p speed_limit(2) # => 80
p speed_limit(3) # => 100
La palabra clave return se debe omitir cuando la última expresión de un método es el valor que se debe devolver.
En este ejercicio vas a trabajar con cuentas de ahorro. Cada año, el saldo de tu cuenta de ahorro se actualiza según su tasa de interés. La tasa de interés que te da tu banco depende de la cantidad de dinero que haya en tu cuenta (su saldo):
1000 dólares.1000 dólares y menor que 5000 dólares.5000 dólares.Tienes cuatro tareas, y cada una se ocupará de tu saldo y su tasa de interés.
Implementa el método SavingsAccount.interest_rate() que recibe un saldo como argumento.
El método debe devolver la tasa de interés para el saldo dado.
SavingsAccount.interest_rate(200.75)
# => 0.5
Implementa el método SavingsAccount.interest() que recibe un saldo como argumento.
El método debe devolver el interés para el saldo dado.
SavingsAccount.interest(200.75)
# => 1.00375
Implementa el método SavingsAccount.annual_balance_update() que recibe un saldo como argumento.
El método debe devolver el saldo después de un año.
SavingsAccount.annual_balance_update(200.75)
# => 201.75375
Implementa el método SavingsAccount.years_before_desired_balance() que recibe un saldo y un saldo objetivo como argumentos.
El método debe devolver la cantidad de años que tomaría alcanzar el saldo objetivo.
balance = 200.75
target_balance = 214.88
SavingsAccount.years_before_desired_balance(balance, target_balance)
# => 14
Al aplicar interés simple a un saldo principal, el saldo se multiplica por la tasa de interés y el producto de ambos es el monto del interés.
El interés compuesto, en cambio, se calcula aplicando el interés de forma recurrente. En cada aplicación, se calcula el monto del interés y se suma al saldo principal, de modo que los cálculos de interés posteriores se hacen sobre un saldo principal mayor.
Regístrate en Exercism para aprender y dominar Crystal con 26 conceptos142 ejercicios y mentoría humana real, todo gratis.