Istnieje swap
method defined for &mut [T]
. Ponieważ Vec<T>
może być mutably dereferenced jako &mut [T]
, metoda ta może być wywołana bezpośrednio:
fn main() {
let mut numbers = vec![1, 2, 3];
println!("before = {:?}", numbers);
numbers.swap(0, 2);
println!("after = {:?}", numbers);
}
Aby to realizować siebie, trzeba napisać jakiś niebezpieczny kod. Vec::swap
is implemented tak:
fn swap(&mut self, a: usize, b: usize) {
unsafe {
// Can't take two mutable loans from one vector, so instead just cast
// them to their raw pointers to do the swap
let pa: *mut T = &mut self[a];
let pb: *mut T = &mut self[b];
ptr::swap(pa, pb);
}
}
trwa dwa surowe wskaźniki z wektora i wykorzystuje ptr::swap
aby zamienić je bezpiecznie.
Istnieje również mem::swap(&mut T, &mut T)
, kiedy trzeba zamienić dwie różne zmienne. Tego nie można tu użyć, ponieważ Rust nie zezwala na wzięcie dwóch zmiennych pożyczek z tego samego wektora.
zaktualizowałem drugą odpowiedź, tak teraz jest to zbędne. – Shepmaster