Tutoriales

Rust Fundamentals Series #7: Uso de bucles en Rust

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.

Publicaciones relacionadas

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 iteratorcomo 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 truecó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, varEl 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, varSe 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 vares mayor que 3, entonces break la palabra clave debe ser ejecutadaPosteriormente, al igual que el ejemplo anterior while anillo, varEl 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 bEn 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 bCuando 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 loopTambié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.

LEER  Se descubre una importante vulnerabilidad de seguridad de PolicyKit en Linux: Pwnkit

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba