如果我有一个本地的、可变的向量,我可以按照以下方式将其分区,这里是从 partition
文档中复制的。
let mut a = vec![1, 2, 3, 4];
let (even, odd): (Vec<i32>, Vec<i32>) = a.into_iter().partition(|&n| n % 2 == 0);
a
向量在此过程中被消耗(移动)。然而,如果我有一个借用的可变引用,则同一调用分区的代码不起作用。如果我尝试在这种情况下使用相同的代码,则会出现错误:
error[E0277]: the trait bound `std::vec::Vec<i32>: std::iter::Extend<&mut i32>` is not satisfied
--> src/main.rs:2:59
|
2 | let (even, odd): (Vec<i32>, Vec<i32>) = a.into_iter().partition(|n| **n % 2 == 0);
| ^^^^^^^^^ the trait `std::iter::Extend<&mut i32>` is not implemented for `std::vec::Vec<i32>`
|
= help: the following implementations were found:
<std::vec::Vec<T> as std::iter::Extend<&'a T>>
<std::vec::Vec<T> as std::iter::Extend<T>>
基于如何将Rust可变引用变为不可变引用?,我写了以下代码,它能够编译并将正确的值放入even
和odd
中。
fn doit(a: &mut Vec<i32>) {
let (even, odd): (Vec<i32>, Vec<i32>) = (&*a).into_iter().partition(|&n| n % 2 == 0);
println!("even {:?}, odd {:?}, a {:?}", even, odd, a);
}
然而,尽管我使用了 into_iter()
,这并没有消耗原始向量。在这里,涉及到可变性、借用或迭代器等一些我还不太理解的概念。