gpt4 book ai didi

vector - Rust `Vec`-无法在 `Vec`方法内借用 `impl`作为不可变的(错误[E0502])

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

关于Rust的error[E0502]的问题有很多答案,但是我真的无法理解一种特殊情况。我有一个struct,它是impl方法,如下所示:

struct Test {
test_vec: Vec<i32>,
}

impl Test {
// other methods...

fn test(&mut self) -> i32 {
self.test_vec.swap(0, self.test_vec.len() - 1);

// other operations...
}
}
尝试立即编译会导致错误:

error[E0502]: cannot borrow self.test_vec as immutable because it is also borrowed as mutable


self.test_vec.swap(0, self.test_vec.len() - 1);
------------- ---- ^^^^^^^^^^^^^ immutable borrow occurs here
| |
| mutable borrow later used by call
mutable borrow occurs here
谁能解释为什么?看起来好像不是我在尝试借用 self.test_vec,而是传递了 usize调用的 len()类型结果。另一方面:
fn test(&mut self) -> i32 {
let last_index = self.test_vec.len() - 1;

self.test_vec.swap(0, last_index);

// other operations...
}
使用临时变量,它按预期方式工作,使我认为 len()调用在到达 swap之后以某种方式进行了评估,因此被借用了吗?因为语法糖,我看不到东西吗?

最佳答案

您必须以编译器的方式来考虑这一点。当你写的时候:

self.test_vec.swap(0, self.test_vec.len() - 1);
编译器看到的内容:
let temp1 = &mut self.test_vec;      // Mutable borrow of self.test_vec
let temp2 = &self.test_vec; // (ERROR!) Shared borrow of self.test_vec for use on getting the length
let temp3 = Vec::len(temp2) - 1;
Vec::swap(temp1, 0, temp3);
如您所见,您首先是可变地借入 self.test_vec,然后尝试获取长度,这是另一次借用。由于第一次借贷是可变的并且仍然有效,因此第二次借贷是非法的。
使用临时变量时,可以有效地对借阅进行重新排序,并且由于 self.test_vec.len()在下一次可变借阅之前会终止借阅,因此不会发生冲突。
您可以认为编译器应该能够看到您的代码是正确的(如果以正确的方式进行解释),但是显然编译器还不够聪明。

关于vector - Rust `Vec`-无法在 `Vec`方法内借用 `impl`作为不可变的(错误[E0502]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62812527/

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