![](/img/trans.png)
[英]How can I capture whether an error occurred in Rust's swap_with_slice() vec method?
[英]How can I swap items in a vector, slice, or array in Rust?
我的代碼看起來像這樣:
fn swap<T>(mut collection: Vec<T>, a: usize, b: usize) {
let temp = collection[a];
collection[a] = collection[b];
collection[b] = temp;
}
Rust很確定我不允許“脫離引用”或“移出索引內容”,不管是什么。 我如何說服Rust這是可能的?
為&mut [T]
定義了一個swap
方法 。 由於Vec<T>
可以作為&mut [T]
被可釋放地解引用 ,因此可以直接調用此方法:
fn main() {
let mut numbers = vec![1, 2, 3];
println!("before = {:?}", numbers);
numbers.swap(0, 2);
println!("after = {:?}", numbers);
}
要自己實現,必須編寫一些不安全的代碼。 Vec::swap
實現如下:
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);
}
}
它從向量中獲取兩個原始指針,並使用ptr::swap
安全地交換它們。
當你需要交換兩個不同的變量時mem::swap(&mut T, &mut T)
還有一個mem::swap(&mut T, &mut T)
。 這不能在這里使用,因為Rust不允許從同一個向量中取兩個可變的借位。
正如@ gsingh2011所提到的,接受的答案不再是好方法。 使用當前的Rust,這段代碼運行良好:
fn main() {
let mut numbers = vec![1, 2, 3];
println!("before = {:?}", numbers);
numbers.swap(0, 2);
println!("after = {:?}", numbers);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.