Как я могу разбить измененный заимствованный вектор?

Mr. Kevin спросил: 03 февраля 2018 в 12:13 в: rust

Если у меня есть локальный изменяемый вектор, я могу разбить его следующим образом, скопированный из документации 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(). Есть что-то о изменчивости, заимствовании или итераторах, которые я просто не получаю здесь.

0 ответов