Wycinki
Wycinek daje wgląd w większą kolekcję:
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:?}");
}
- Wycinki pożyczają dane od ciętego typu.
- Question: What happens if you modify
a[3]right before printings?
-
Tworzymy wycinek, pożyczając
ai określając indeksy początkowe i końcowe w nawiasach. -
Jeśli wycinek zaczyna się od indeksu 0, składnia zakresu Rusta pozwala nam pominąć indeks początkowy, co oznacza, że
&a[0..a.len()]i&a[..a.len()]są identyczne . -
To samo dotyczy ostatniego indeksu, więc
&a[2..a.len()]i&a[2..]są identyczne. -
Aby łatwo utworzyć wycinek pełnej tablicy, możemy zatem użyć
&a[..]. -
sjest referencją do wycinka elementówi32. Zauważ, że typs(&[i32]) nie wspomina już o długości tablicy. To pozwala nam wykonywać obliczenia na wycinkach o różnych rozmiarach. -
Slices always borrow from another object. In this example,
ahas 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 throughaat this point in the execution, but you can read the data from bothaandssafely. It works before you created the slice, and again after theprintln, when the slice is no longer used.