gpt4 book ai didi

rust - 有条件地从二进制堆中弹出元素时,借用检查器不满意

转载 作者:行者123 更新时间:2023-11-29 07:50:22 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的函数,它会从满足特定条件的 BinaryHeap 中弹出元素。该函数如下所示:

fn check_the_queue(mut queue: BinaryHeap<i32>) {
while !queue.is_empty() {
let entry = queue.peek().unwrap();
if *entry <= 0 {
queue.pop();
}
}

当编译借用检查器开始提示时:

src/main.rs:52:13: 52:18 error: cannot borrow `queue` as mutable because it is also borrowed as immutable

我怎样才能解决这个问题并让借阅检查员满意?

最佳答案

错误信息描述性很强:

<anon>:8:13: 8:18 error: cannot borrow `queue` as mutable because it is also borrowed as immutable
<anon>:8 queue.pop();
^~~~~
<anon>:5:21: 5:26 note: previous borrow of `queue` occurs here; the immutable borrow prevents subsequent moves or mutable borrows of `queue` until the borrow ends
<anon>:5 let entry = queue.peek().unwrap();
^~~~~
<anon>:10:6: 10:6 note: previous borrow ends here
<anon>:4 while !queue.is_empty() {
...
<anon>:10 }
^

问题是这个借用了queue :

let entry = queue.peek().unwrap();

peek()返回 Option<&T> ,也就是说,一个选项引用了 T 类型的值.借用有效期为 entry还活着,直到函数结束。它指向存储在堆内的东西,所以它不可变地借用了堆。也就是说,只要entry存活(直到函数结束),堆被不变地借用。

queue.pop()可变地借用堆,因此,当您到达那里时,堆已被不变地借用,并且您尝试同时可变地借用它。

借用检查器规则声明你不能同时借用可变和不可变的东西,所以你有问题。

要修复它,请找到避免同时借入两次的方法。例如,您可以这样做:

fn check_the_queue(mut queue: BinaryHeap<i32>) {
while !queue.is_empty() {
if *queue.peek().unwrap() <= 0 {
queue.pop();
}
}
}

也就是说,只删除变量entry .这是可行的,因为当您到达 queue.pop() 时, 没有其他活跃的借用,借用检查员很高兴 :)

生命周期和借用规则一开始可能很难理解,但随着时间的推移,陡峭的学习曲线会带来返回。

关于rust - 有条件地从二进制堆中弹出元素时,借用检查器不满意,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29736078/

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