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 stampares
?
-
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 dii32
s. Si noti che il tipo dis
(&[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 througha
at this point in the execution, but you can read the data from botha
ands
safely. It works before you created the slice, and again after theprintln
, when the slice is no longer used.