Un array en Rust es una colección de elementos de un mismo tipo (homogénea) que tiene un tamaño definido en el momento de la compilación y que no puede cambiar durante la ejecución. Su sintaxis es [T; N], donde T es el tipo de dato y N es la cantidad de elementos.

A diferencia de los vectores (Vec<T>), los arrays se almacenan directamente en el stack (pila). Esto los hace extremadamente rápidos y eficientes, ya que el sistema sabe exactamente cuánta memoria reservar desde el principio y no necesita realizar asignaciones en el heap. Sin embargo, esta eficiencia tiene un costo: la rigidez. Al ser el tamaño parte de su definición de tipo, un array de [i32; 5] es un tipo de dato completamente distinto a un [i32; 6]; no puedes añadir ni quitar elementos de uno a otro.

Debes usar arrays cuando conozcas la cantidad exacta de elementos de antemano (por ejemplo, los 7 días de la semana o las 3 coordenadas de un punto en un espacio) y desees el máximo rendimiento sin la sobrecarga de la gestión de memoria en el heap. Si intentas acceder a un índice que no existe (por ejemplo, el elemento 10 en un array de 5), Rust provocará un panic, lo que detendrá la ejecución del programa para evitar errores de acceso a memoria no permitidos.

fn main() {
    // Definición de un array con 5 elementos de tipo i32
    // El tamaño [5] es parte integral del tipo de dato
    let numeros: [i32; 5] = [10, 20, 30, 40, 50];

    // Inicialización rápida: un array de 5 ceros
    // Sintaxis: [valor; tamaño]
    let ceros: [i32; 5] = [0; 5];

    // Acceso a un elemento mediante su índice (comienza en 0)
    let segundo_elemento = numeros[1];

    // El método .len() devuelve la longitud constante del array
    let longitud = numeros.len();

    println!("Array numeros: {:?}", numeros);
    println!("El segundo elemento es: {}", segundo_elemento);
    println!("Longitud: {}", longitud);
    println!("Array ceros: {:?}", ceros);

    // Iteración sobre el array usando referencias (&)
    // Usamos &numeros para no tomar posesión (ownership) del array
    println!("Iterando sobre los elementos:");
    for valor in &numeros {
        println!("Valor actual: {}", valor);
    }

    // Nota: Si usáramos 'for valor in numeros', el array se movería 
    // y no podríamos usarlo después de este bucle.
}

Explicación del Código

  • let numeros: [i32; 5] = [10, 20, 30, 40, 50];: Declara una variable llamada numeros de tipo [i32; 5]. Contiene cinco enteros de 32 bits.
  • let ceros: [i32; 5] = [0; 5];: Utiliza la sintaxis abreviada para crear el array ceros con cinco elementos, todos inicializados con el valor 0.
  • let segundo_elemento = numeros[1];: Accede al segundo elemento de numeros. Como los índices empiezan en 0, el índice 1 corresponde al valor 20.
  • let longitud = numeros.len();: Llama al método .len() sobre numeros, que retorna el tamaño constante 5.
  • println!(..., {:?}", numeros);: Se utiliza {:?} para imprimir el array completo mediante el trait Debug.
  • for valor in &numeros: Inicia un bucle sobre el array. Al usar &numeros, estamos iterando sobre referencias (&i32). Esto es crucial porque permite que el array numeros siga siendo válido después del bucle; si no usáramos el símbolo &, el array se “movería” (ownership) al bucle y no podríamos volver a usarlo.
  • println!("Valor actual: {}", valor);: Imprime cada valor obtenido durante la iteración.

16