Un segmento o slices te da una vista de una colección más grande:
fn main() {
let a: [i32; 6] = [10, 20, 30, 40, 50, 60];
println!("a: {a:?}");
let s: &[i32] = &a[2..4];
println!("s: {s:?}");
}
$ cargo run
Compiling hello_cargo v0.1.0
Finished dev [unoptimized + debuginfo] target(s) in 1.62s
Running `target/debug/hello_cargo`
a: [10, 20, 30, 40, 50, 60]
s: [30, 40]
Creamos un segmento a partir de un arreglo y especificando los índices inicial y final entre paréntesis.
Si el segmento comienza en el índice 0, la sintaxis de rango de Rust nos permite descartar el índice inicial, lo que significa que &a[0..a.len()] y &a[..a.len()] son idénticos.
Lo mismo ocurre con el último índice, por lo que &a[2..a.len()] y &a[2..] son idénticos.
Para crear fácilmente una porción de la matriz completa, podemos usar &a[..].
s es una referencia a una porción de i32s. Y el tipo de s es &[i32] y no menciona la longitud del vector. Esto nos permite realizar cálculos en rebanadas de diferentes tamaños.
Las rebanadas siempre toman prestado de otro objeto. En este ejemplo, a tiene que permanecer "vivo" durante al menos el mismo tiempo que nuestro segmento.
La pregunta sobre la modificación de a[3] puede generar una discusión interesante, pero la respuesta es que, por razones de seguridad de la memoria, no puede hacerlo a través de a después de crear un segmento, pero puede leer los datos de a y s de forma segura.