Bucles y rangos en Rust

RustRustBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprendemos a usar los bucles for y los rangos en Rust. Podemos usar el bucle for junto con la notación de rango a..b para iterar a través de un rango de valores. Por ejemplo, podemos escribir el programa FizzBuzz usando un bucle for en lugar de un bucle while. Además, podemos usar la notación ..= para un rango que es inclusivo en ambos extremos. El bucle for también puede interactuar con los iteradores de diferentes maneras, como usando iter para prestar prestado cada elemento de una colección, into_iter para consumir la colección o iter_mut para prestar prestado mutuamente cada elemento de la colección. Cada uno de estos métodos proporciona una vista diferente de los datos dentro de la colección, lo que permite realizar diferentes acciones.

Nota: Si el laboratorio no especifica un nombre de archivo, puede usar cualquier nombre de archivo que desee. Por ejemplo, puede usar main.rs, compilar y ejecutarlo con rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/ControlStructuresGroup(["Control Structures"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/BasicConceptsGroup -.-> rust/mutable_variables("Mutable Variables") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/ControlStructuresGroup -.-> rust/for_loop("for Loop") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") subgraph Lab Skills rust/variable_declarations -.-> lab-99308{{"Bucles y rangos en Rust"}} rust/mutable_variables -.-> lab-99308{{"Bucles y rangos en Rust"}} rust/string_type -.-> lab-99308{{"Bucles y rangos en Rust"}} rust/for_loop -.-> lab-99308{{"Bucles y rangos en Rust"}} rust/function_syntax -.-> lab-99308{{"Bucles y rangos en Rust"}} rust/expressions_statements -.-> lab-99308{{"Bucles y rangos en Rust"}} rust/method_syntax -.-> lab-99308{{"Bucles y rangos en Rust"}} end

Bucles for

for y rango

La construcción for in se puede utilizar para iterar a través de un Iterator. Una de las maneras más fáciles de crear un iterador es usar la notación de rango a..b. Esto produce valores desde a (inclusivo) hasta b (exclusivo) en pasos de uno.

Escribamos FizzBuzz usando for en lugar de while.

fn main() {
    // `n` tomará los valores: 1, 2,..., 100 en cada iteración
    for n in 1..101 {
        if n % 15 == 0 {
            println!("fizzbuzz");
        } else if n % 3 == 0 {
            println!("fizz");
        } else if n % 5 == 0 {
            println!("buzz");
        } else {
            println!("{}", n);
        }
    }
}

Alternativamente, a..=b se puede utilizar para un rango que es inclusivo en ambos extremos. Lo anterior se puede escribir como:

fn main() {
    // `n` tomará los valores: 1, 2,..., 100 en cada iteración
    for n in 1..=100 {
        if n % 15 == 0 {
            println!("fizzbuzz");
        } else if n % 3 == 0 {
            println!("fizz");
        } else if n % 5 == 0 {
            println!("buzz");
        } else {
            println!("{}", n);
        }
    }
}

for e iteradores

La construcción for in es capaz de interactuar con un Iterator de varias maneras. Como se discutió en la sección sobre el trato Iterator, por defecto el bucle for aplicará la función into_iter a la colección. Sin embargo, esta no es la única forma de convertir colecciones en iteradores.

into_iter, iter e iter_mut todos manejan la conversión de una colección en un iterador de diferentes maneras, al proporcionar diferentes vistas sobre los datos dentro de la misma.

  • iter - Esto presta prestado cada elemento de la colección en cada iteración. De esta manera, la colección queda intacta y disponible para reutilizarse después del bucle.
fn main() {
    let names = vec!["Bob", "Frank", "Ferris"];

    for name in names.iter() {
        match name {
            &"Ferris" => println!("There is a rustacean among us!"),
            // TODO ^ Intenta eliminar el & y coincidir solo con "Ferris"
            _ => println!("Hello {}", name),
        }
    }

    println!("names: {:?}", names);
}
  • into_iter - Esto consume la colección para que en cada iteración se proporcione exactamente los datos. Una vez que la colección ha sido consumida, ya no está disponible para reutilizarse ya que ha sido'movida' dentro del bucle.
fn main() {
    let names = vec!["Bob", "Frank", "Ferris"];

    for name in names.into_iter() {
        match name {
            "Ferris" => println!("There is a rustacean among us!"),
            _ => println!("Hello {}", name),
        }
    }

    println!("names: {:?}", names);
    // FIXME ^ Comenta esta línea
}
  • iter_mut - Esto presta prestado mutuamente cada elemento de la colección, lo que permite modificar la colección in situ.
fn main() {
    let mut names = vec!["Bob", "Frank", "Ferris"];

    for name in names.iter_mut() {
        *name = match name {
            &mut "Ferris" => "There is a rustacean among us!",
            _ => "Hello",
        }
    }

    println!("names: {:?}", names);
}

En los fragmentos de código anteriores, observe el tipo de rama match, que es la diferencia clave en los tipos de iteración. La diferencia en tipo, por supuesto, implica diferentes acciones que pueden ser realizadas.

Resumen

¡Felicidades! Has completado el laboratorio de Bucles for. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.