Có một số swap
method defined for &mut [T]
. Kể từ khi một Vec<T>
có thể mutably dereferenced như một &mut [T]
, phương pháp này có thể được gọi trực tiếp:
fn main() {
let mut numbers = vec![1, 2, 3];
println!("before = {:?}", numbers);
numbers.swap(0, 2);
println!("after = {:?}", numbers);
}
Để thực hiện điều này cho mình, bạn phải viết một số mã không an toàn. Vec::swap
is implemented như thế này:
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);
}
}
Phải mất hai con trỏ thô từ các vector và sử dụng ptr::swap
để trao đổi chúng một cách an toàn.
Ngoài ra còn có mem::swap(&mut T, &mut T)
khi bạn cần trao đổi hai biến riêng biệt. Điều đó không thể được sử dụng ở đây vì Rust sẽ không cho phép lấy hai khoản vay có thể thay đổi từ cùng một véc tơ.
Tôi đã cập nhật câu trả lời khác, vì vậy đây là hiện nay không cần thiết. – Shepmaster