Saltar al contenido principal

Tipos de Colecciones

Vectores Vec<T>

  • Permiten almacenar más de un valor en una sola estructura de datos
  • Los vectores solo pueden almacenar valores del mismo tipo
  • Se almacenarán en la memoria (heap) de forma contigua
  • Se pueden acceder a los elementos de un vector mediante un índice ([1], ...)
  • Se pueden modificar los elementos de un vector
  • A diferencia de los arrays, los vectores son de tamaño dinámico
fn vectors() {
    // Crear e inicializar un vector
    let v_inicializado: Vec<char> = vec!['a', 'b', 'c'];

    // Crear un vector vacío
    let mut numeros: Vec<i32> = Vec::new();
    // Agregar valores
    numeros.push(1);
    numeros.push(2);
    numeros.push(3);

    println!("{:?}", numeros); // 1, 2, 3

    // Acceder a un elemento de un vector
    // Será una referencia inmutable
    let segundo = &numeros[1];
    println!("El segundo elemento es: {}", segundo);

    // Acceder a un elemento de un vector con GET
    // Devuelve un Option<T>
    let tercero = numeros.get(2);
    match tercero {
        Some(valor) => println!("El tercer elemento es: {}", valor),
        None => println!("No hay tercer elemento"),
    }

    // Iterar sobre un vector
    for letra in &v_inicializado {
        println!("{}", letra); // a, b, c
    }

    // Iterar sobre un vector y modificar los valores
    for numero in &mut numeros {
        *numero += 10;
    }

    println!("{:?}", numeros); // [11, 12, 13]
}

UTF-8 - Strings

  • Los strings son colecciones de caracteres Unicode
  • Se pueden modificar
  • Se pueden acceder a los caracteres mediante índices
  • Se pueden iterar sobre los caracteres
  • Los Strings se almacenan en el binario de Rust como UTF-8
  • Los &str son slices de un String (referencias a un String)
fn main() {
    // 1
    let s = "Hola mundo".to_string();
    println!("{}", s);

    // 2
    let s = String::from("Reasignando el valor (shadowing)");
    println!("{}", s);

    // 3 mutable, modificar el valor
    let mut s = String::from("Hola");
    s.push_str(" mutado"); // Agregar un string
    s.push('!'); // Agregar un solo caracter
    println!("{}", s);
}

 Concatenar strings

let s1 = String::from("Nombre");
let s2 = String::from(" Apellido");

// s1 se mueve aquí y ya no se puede usar
// s2 se copia aquí y sigue siendo válida
// No se puede concatenar dos Strings
// Porque la firma de la función es: fn add(self, s: &str) -> String
let s3 = s1 + &s2;
println!("{}", s3);
//println!("{}", s1); // Error: value borrowed here after move
println!("{}", s2);

Formatear strings

/*
Se utiliza la macro format! para combinar múltiples valores en un String
Similar a concatenar Strings, pero más eficiente
Similar a println! pero no imprime en la consola sino que devuelve un String
*/

let nombre = "Juan";
let edad = 30;
let mensaje = format!("{} tiene {} años", nombre, edad);

println!("{}", mensaje);

HashMap

  • Permiten almacenar pares clave-valor
  • Las claves deben ser únicas
  • Se pueden insertar, actualizar y eliminar elementos
  • Se pueden acceder a los elementos mediante la clave
  • Ocupa dos valores, K y V
  • En otros lenguajes se conocen como: Diccionarios (Python), Object (JavaScript)      
fn hash_maps() {
    use std::collections::HashMap;
   
    // Crear y despuea asignar valores al HasMap
    let mut scores = HashMap::new();
    scores.insert(String::from("Azul"), 10);
    scores.insert(String::from("Rojo"), 20);


    /*
    La función get busca en el mapa scores el valor asociado con la clave
    y devuelve una referencia a ese valor si existe
   
    copied se utiliza para realizar una copia del valor devuelto por get
    Esto es necesario porque el método get devuelve una referencia
    al valor almacenado en el mapa, y en este caso
    queremos obtener una copia del valor en sí.

    .unwrap_or(0): en caso de que la función get no encuentre un valor
    asociado con la clave, se devuelve el default 0.
    */
    let clave = String::from("Azul");
    let score = scores.get(&clave).copied().unwrap_or(0);
    println!("El score de {} es: {}", clave, score);

    /*
    Iterando sobre el mapa
    */
    for (k, v) in &scores {
        println!("{k}: {v}");
    }
}