Slice

Una slice ti offre una vista in una raccolta più ampia:

fn main() {
    let mut a: [i32; 6] = [10, 20, 30, 40, 50, 60];
    println!("a: {a:?}");

    let s: &[i32] = &a[2..4];

    println!("s: {s:?}");
}
  • Le sezioni prendono in prestito i dati dal tipo della raccolta.
  • Domanda: Cosa succede se modifichi a[3] prima di stampare s?
This slide should take about 10 minutes.
  • Creiamo una sezione prendendo in prestito a e specificando gli indici iniziale e finale tra parentesi.

  • Se la slice inizia all’indice 0, la sintassi dell’intervallo di Rust ci consente di eliminare l’indice iniziale, il che significa che &a[0..a.len()] e &a[..a.len()] sono identici .

  • Lo stesso vale per l’ultimo indice, quindi &a[2..a.len()] e &a[2..] sono identici.

  • Per creare facilmente una porzione dell’array completo, possiamo quindi utilizzare &a[..].

  • s è un riferimento a una porzione di i32s. Si noti che il tipo di s (&[i32]) non menziona più la lunghezza dell’array. Questo ci permette di eseguire il calcolo su fette di diverse dimensioni.

  • Slices always borrow from another object. In this example, a has to remain ‘alive’ (in scope) for at least as long as our slice.

  • The question about modifying a[3] can spark an interesting discussion, but the answer is that for memory safety reasons you cannot do it through a at this point in the execution, but you can read the data from both a and s safely. It works before you created the slice, and again after the println, when the slice is no longer used.