gpt4 book ai didi

collections - 如何通过获取可变变量的所有权来替换它的值?

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

我正在使用一个 LinkedList,我想删除所有未通过测试的元素。但是,我遇到了错误 cannot move out of borrowed content

据我所知,这是因为我正在使用 &mut self,所以我无权使其中一个值无效(即移动),即使是暂时构造一个其值的新列表。

在 C++/Java 中,我会简单地迭代列表并删除任何符合条件的元素。由于我还没有找到删除,所以我将其解释为迭代、过滤和收集。

目标是避免创建临时列表、克隆值以及需要获取 self 并返回"new"对象。我构建了一个产生相同错误的示例。 Playground .

use std::collections::LinkedList;

#[derive(Debug)]
struct Example {
list: LinkedList<i8>,
// Other stuff here
}

impl Example {
pub fn default() -> Example {
let mut list = LinkedList::new();
list.push_back(-5);
list.push_back(3);
list.push_back(-1);
list.push_back(6);
Example { list }
}

// Simmilar idea, but with creating a new list
pub fn get_positive(&self) -> LinkedList<i8> {
self.list.iter()
.filter(|&&x| x > 0)
.map(|x| x.clone())
.collect()
}

// Now, attempt to filter the elements without cloning anything
pub fn remove_negative(&mut self) {
self.list = self.list.into_iter()
.filter(|&x| x > 0)
.collect()
}
}

fn main() {
let mut e = Example::default();
println!("{:?}", e.get_positive());
println!("{:?}", e);
}

在我的实际情况下,我不能简单地使用包装对象,因为它需要从不同的地方引用并包含其他重要值。

在我的研究中,我发现了一些 unsafe code这让我怀疑是否可以构造一个安全函数来以类似于 std::mem::replace 的方式执行此操作.

最佳答案

您可以使用临时std::mem::swap您的字段,然后像这样用您修改过的列表替换它。最大的缺点是创建了新的 LinkedList。我不知道那有多贵。

pub fn remove_negative(&mut self) {
let mut temp = LinkedList::new();
std::mem::swap(&mut temp, &mut self.list);

self.list = temp.into_iter()
.filter(|&x| x > 0)
.collect();
}

关于collections - 如何通过获取可变变量的所有权来替换它的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46994934/

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