Ce face Vec::split_at
split_at(mid) returnează un tuplu cu două slice-uri: [0..mid) și [mid..len). Nimic nu este copiat sau mutat; sunt doar două „ferestre” spre același vector. Un mid mai mare decât lungimea oprește programul; split_at_checked (Rust 1.80) returnează None în acest caz.
split_at_mut este modul în care obții două referințe mutabile spre părți diferite ale aceluiași vector. Regulile de împrumut nu permit &mut v[0] și &mut v[3] deodată, dar permit două jumătăți separate.
Parametri
| Parametru | Descriere |
|---|---|
mid |
Poziția de tăiere, între 0 și len(). Elementul de pe ea ajunge în a doua parte. |
Ce returnează
Un tuplu (stânga, dreapta) de slice-uri.
Exemple
Exemplul 1: Notele pe semestre
fn main() {
let note = vec![9, 7, 10, 8, 6, 10];
let (sem1, sem2) = note.split_at(3);
println!("semestrul 1: {:?}, semestrul 2: {:?}", sem1, sem2);
let (tot, nimic) = note.split_at(note.len());
println!("{:?} | {:?}", tot, nimic);
println!("split_at_checked(10): {:?}", note.split_at_checked(10));
}
Rezultat
semestrul 1: [9, 7, 10], semestrul 2: [8, 6, 10]
[9, 7, 10, 8, 6, 10] | []
split_at_checked(10): None
Exemplul 2: Două părți modificate în același timp
Adunăm fiecărui element din prima jumătate elementul corespunzător din a doua.
fn main() {
let mut scoruri = vec![1, 2, 3, 40, 50, 60];
let (stanga, dreapta) = scoruri.split_at_mut(3);
for (a, b) in stanga.iter_mut().zip(dreapta.iter()) {
*a += b;
}
println!("{:?}", scoruri);
}
Rezultat
[41, 52, 63, 40, 50, 60]
Greșeli frecvente
- Încerci să iei două referințe mutabile cu indexare (
let a = &mut v[0]; let b = &mut v[1];): cannot borrow `v` as mutable more than once at a time. Foloseștesplit_at_mutsauv.swap(0, 1). - Folosești
split_atcu o poziție venită din date: o valoare prea mare oprește programul. Verifică sau foloseștesplit_at_checked.
Comenzi înrudite
Vec::split_off: Taie vectorul în două la o poziție: primele elemente rămân, restul sunt mutate într-un vector nou returnat.Vec::windows: windows dă ferestre suprapuse de câte n elemente consecutive; chunks împarte vectorul în bucăți separate de câte n.Vec::get: Citește elementul de pe o poziție fără risc de panic: returnează Some(&element) sau None dacă poziția nu există.Vec::starts_with: Verifică dacă vectorul începe cu elementele date (în aceeași ordine); ends_with verifică sfârșitul.