gpt4 book ai didi

rust - 在同一个选项上匹配多次会产生太多对 self 的可变引用

转载 作者:行者123 更新时间:2023-12-05 03:22:30 26 4
gpt4 key购买 nike

这是一个概念性问题,但这段代码无法编译:

struct HashHolder{
pub thing: HashMap<usize, usize>,
}
impl HashHolder {
fn insert(&mut self, item: &usize) {
let test = self.thing.get(item).clone(); // immutable borrow occurs here
for i in 0..10 {
match test { // immutable borrow later used here
Some(t) => {
//nothing
},
None => {
self.thing.insert(0, item.clone()); // mutable borrow occurs here
}
}
}
}
}

它给出“错误[E0502]:不能将 self.thing 借用为可变的,因为它也被借用为不可变的”,并突出显示上面显示的行。

但是,如果我去掉 for 循环,它编译得很好!在我看来,这应该可以毫无问题地编译:match 的范围在循环的每次迭代中结束,因此所有引用都应该是“新鲜的”。如果我删除循环并再次复制粘贴 match block ,则会产生相同的错误。

我对引用/借用的理解是:

  1. self 是不变地借用的 self.thing.get(item)。但是在 clone() 之后,它应该释放借用的吗?
  2. selfself.thing.insert(...); 处被可变地借用,但是一旦 insert 完成执行,那个借用也应该被释放。

所以我不明白为什么会出现这个错误。此外,编译器突出显示的行是无用的,因为这三行,没有 for 循环,是完全没问题的!

我对这段代码中发生的事情的理解有什么错误吗?如果我想多次匹配,什么结构会更好?

采用这种方式的部分原因是,在我的实际项目中,test的值会随着循环而变化,在某些情况下可以赋值,所以match 在不同的迭代中可能表现不同。也许这不是我想要的行为的最佳方法,但我仍然想了解为什么它甚至无法编译。

最佳答案

self.thing.get(item)返回 Option<&usize> 类型的值其中包含对 self.thing 的引用.当你克隆这个值时,你只克隆了 Option然后你得到另一个 Option<&usize>其中仍然包含对 self.thing 的引用.如果你想获得一个拥有的值,你需要用 Option::cloned 克隆内部值(或 Option::copied 因为 usizeCopy )这会给你一个 Option<usize> .

关于rust - 在同一个选项上匹配多次会产生太多对 self 的可变引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72699718/

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