
En el artículo anterior de la serie Rust, revisé el uso de las palabras clave if y else para manejar el flujo de control de los programas Rust.
Esta es una forma de manejar el flujo de control del programa. Otra forma es usar un bucle. Así que echemos un vistazo al bucle en este artículo de seguimiento.
Bucles disponibles en Rust
El lenguaje de programación Rust tiene tres bucles diferentes según lo que quieras lograr y lo que esté disponible:
Creo que estás familiarizado for
y while
pero loop
Podría ser nuevo aquí. Comencemos con un concepto familiar.
en bucle
este for
Los bucles se utilizan principalmente para iterar cosas llamadas iteradores.
Este iterador puede estar hecho de cualquier cosa, puede ser una matriz, un vector (¡más sobre esto pronto!), una secuencia de valores o cualquier cosa personalizada. El cielo es el limite aqui.
Veamos la sintaxis for
anillo.
for iterating_variable in iterator {
;
}
este iterating_variable
es comúnmente llamado i
en la mayoría de los otros tutoriales de lenguajes de programación;)
y iterator
como dije, puede ser cualquier cosa que indique cuál es el siguiente valor, si lo hay.
Entendamos esto con un programa.
fn main() {
let my_arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
println!("iteration over an array");
for element in my_arr {
println!("{}", element);
}
println!("\niteration over a real iterator");
for element in my_arr.iter() {
println!("{}", element);
}
println!("\nPython-style range");
for element in 0..10 {
println!("{}", element);
}
}
Aquí, declaro una matriz de 10 números, del 0 al 9.existir for
En el ciclo de la línea 5, solo especifico esta matriz como un iterador, y Rust maneja automáticamente la iteración sobre todos los elementos de esta matriz por mí.no es elegante my_arr[i]
Se requiere magia.
Pero en la línea 10, llamo .iter()
Funciones en arreglos.Aquí hay una mención explícita de obtener un iterador basado en valores my_arr
Consiste en.La única diferencia entre este ciclo y el ciclo de la línea 5 es que aquí se llama .iter()
Funciones en arreglos.
transferir .iter()
funciones sobre tipos de datos, en este caso, No estrictamente necesario. Dado que se trata de una matriz, un tipo de datos proporcionado por el propio lenguaje, Rust ya sabe cómo manejarlo.pero tu voluntad Lo necesito con tipos de datos personalizados.
Finalmente, en la línea 15, tenemos un ciclo for que recorre el rango. Está bien. Si observa de cerca, este rango se ve muy similar al «tipo» de segmento. Rust también lo sabe y maneja la iteración. para Tú (jaja, ¿entiendes?).
La salida se ve así:
iteration over an array
0
1
2
3
4
5
6
7
8
9
iteration over a real iterator
0
1
2
3
4
5
6
7
8
9
Python-style range
0
1
2
3
4
5
6
7
8
9
mientras bucle
este while
Se puede pensar que un bucle es muy similar a if
Declaraciones condicionales.junto con if
instrucción, siempre que la condición proporcionada por el usuario se evalúe como true
código en if
El cuerpo de la instrucción se ejecuta. una vez.
pero con while
Bucle si la condición se evalúa como true
, el ciclo comienza a atravesar el cuerpo del ciclo.El ciclo continúa iterando mientras la condición continúa evaluando true
.
este while
El ciclo se detiene solo cuando el ciclo ha terminado de ejecutar todas las declaraciones en la iteración actual y mientras verifica la condición, se evalúa como false
.
Veamos la sintaxis del ciclo while…
while condition {
;
}
¿mirar?muy parecido a un if
¡Declaraciones condicionales!No else
Aunque bloquee 😉
Veamos un programa para entender esto mejor.
fn main() {
let mut var = 0;
while var
Tengo una variable mutable, var
El valor inicial es 0. while
El bucle se repetirá siempre que el valor almacenado en la variable mutable var
menos de 3.
Dentro del bucle, var
Se imprime el valor de, después de lo cual su valor se incrementa en 1.
A continuación se muestra el resultado del código escrito anteriormente:
0
1
2
ciclo
Rust tiene un bucle infinito. Sí, no hay ninguna condición para comenzar ni ninguna condición para detenerse. Simplemente se repite una y otra vez hasta el infinito. Pero, por supuesto, hay activadores para detener la ejecución del bucle del propio código.
La sintaxis de este bucle infinito es la siguiente:
loop {
;
}
📋
Estos bucles se utilizan principalmente en el software GUI donde salir es un claramente Operación.
Antes de darte un ejemplo, porque este bucle es especial, veamos cómo salida eso :p
Para detener la ejecución de un bucle infinito, break
La palabra clave se utiliza dentro de un bucle.
Veamos un ejemplo en el que solo los números enteros entre 0 y 3 (inclusive) se imprimen en la salida del programa.
fn main() {
let mut var = 0;
loop {
if var > 3 {
break;
}
println!("{}", var);
var += 1;
}
}
La mejor manera de explicar este ejemplo particular es pensar en él como una forma extendida innecesaria de while
Anillo 😉
tienes una variable mutable var
El valor inicial es 0, usado como un iterador, más o menos.El ciclo infinito comienza con if
requisito es debería var
es mayor que 3, entonces break
la palabra clave debe ser ejecutadaPosteriormente, al igual que el ejemplo anterior while
anillo, var
El valor de se imprime en la salida estándar, luego su valor se incrementa en 1.
Produce la siguiente salida:
0
1
2
3
ciclo de marca
Supongamos que hay dos bucles infinitos, uno anidado dentro del otro. Por alguna razón, la condición de salida se verifica en el ciclo más interno, pero esta condición de salida se usa para salir del ciclo más externo.
En este caso, puede ser beneficioso marcar el bucle.
💡
uso de etiquetas break
y continue
La palabra clave no es exclusiva de bucles infinitos. Se pueden usar con los tres bucles proporcionados por el lenguaje Rust.
Aquí se explica cómo marcar bucles.
'label: loop {}
Para decirle al compilador que se está marcando un bucle, comience con un carácter de comilla simple, escriba su etiqueta, seguido de dos puntos. Luego, pasa a cómo defines tu ciclo regularmente.
Cuando necesite romper un bucle determinado, simplemente especifique la etiqueta del bucle de esta manera:
break 'label;
Veamos un ejemplo para entender esto mejor.
fn main() {
let mut a = 0;
let mut b = 0;
'parent: loop {
a += 1;
loop {
println!("a: {}, b: {}", a, b);
b += 1;
if a + b == 10 {
println!("\n{} + {} = 10", a, b);
break 'parent;
}
}
}
}
Aquí he tomado dos variables mutables a
y b
El valor inicial de ambos se establece en 0.
Más adelante, el bucle más externo está marcado como parent
.bucle ‘padre’ incrementa el valor de varaible a
1 y tiene un bucle interno/sub.
Este subbucle (línea 8) imprime el valor de la variable a
y b
En este ciclo, el valor b
aumentar en 1.La condición de salida es a + b == 10
.significa que siempre que el valor almacenado en la variable a
y b
Cuando se suman, el resultado es 10, parent
El bucle está roto.a pesar de break
La condición en la línea 14 «pertenece» al ciclo interno, que se rompe parent
anillo.
Ahora veamos la salida del programa.
a: 1, b: 0
a: 1, b: 1
a: 1, b: 2
a: 1, b: 3
a: 1, b: 4
a: 1, b: 5
a: 1, b: 6
a: 1, b: 7
a: 1, b: 8
1 + 9 = 10
Es evidente a partir de la salida del programa que una vez que el ciclo se detiene a
y b
tienen valores 1 y 9, respectivamente.
continuar palabra clave
Si ha utilizado bucles en cualquier otro lenguaje de programación como C/C++/Java/Python, probablemente ya sepa continue
Palabras clave.
A pesar de break
La palabra clave es detener la ejecución del bucle por completo, continue
palabra clave para «saltar» iteración actual El ciclo se ejecuta y comienza la siguiente iteración (si las condiciones lo permiten).
Veamos un ejemplo para entender continue
La palabra clave es válida.
fn main() {
for i in 0..10 {
if i % 2 == 0 {
continue;
}
println!("{}", i)
}
}
En el código anterior, tengo un for
Repita los números enteros entre 0 y 9, inclusive. Tan pronto como comienza el ciclo, realizo una verificación condicional para ver si el número es par.Si el número es par, entonces continue
se ejecuta la palabra clave.
Pero si el número es impar, el número se imprime en la salida del programa.
Veamos primero la salida de este programa.
1
3
5
7
9
Como puede ver, el ciclo parece seguir «continuando», aunque aparentemente hay números pares entre 0 y 9.Pero desde que usé continue
Una palabra clave, cuando se encuentra la palabra clave, la ejecución del ciclo se detiene.
El ciclo salta cualquier cosa debajo de él y continúa con la siguiente iteración. Es por eso que en lugar de imprimir números pares, todos los números impares entre 0 y 9 se imprimen en la salida del programa.
en conclusión
Para finalizar esta larga publicación, demuestro el uso de 3 bucles diferentes: for
, while
y loop
También analizo dos palabras clave que afectan el flujo de control de estos bucles: break
y continue
.
Espero que ahora comprenda el caso de uso adecuado para cada bucle. Por favor hazme saber si tienes preguntas.