gpt4 book ai didi

rust - 如何划分可变借用的向量?

转载 作者:行者123 更新时间:2023-11-29 08:23:36 25 4
gpt4 key购买 nike

如果我有一个本地的、可变的向量,我可以按如下方式对其进行分区,复制自 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>>

基于 How to make a Rust mutable reference immutable? ,我编写了以下代码,它编译并将正确的值放入 evenodd 中。

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()。关于可变性、借用或迭代器的某些内容,我只是没有在此处介绍。

最佳答案

正如其他人所暗示的,您不能移动原始矢量,因为您不拥有它。但是,您可以将所有值移出向量,将其留空。这可以通过 drain 来完成方法:

fn doit(a: &mut Vec<i32>) {
let (even, odd): (Vec<i32>, Vec<i32>) = a.drain(..).partition(|&n| n % 2 == 0);
println!("even {:?}, odd {:?}, a {:?}", even, odd, a);
}

playground

关于rust - 如何划分可变借用的向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49020804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com