我一直在和借用检查器作斗争……我想做的主要事情是这样的:
#[derive(Debug)]
struct SomeStruct {
value: String,
}
impl SomeStruct {
fn new(value: &str) -> SomeStruct {
SomeStruct { value: value.to_string() }
}
fn change_value(&mut self, new_value: &str) {
self.value = new_value.to_string();
}
}
fn main() {
let mut my_vec = vec![
SomeStruct::new("foo"),
SomeStruct::new("bar"),
];
my_vec[0].change_value(my_vec[1].value.as_str());
}
这是一个非常泛化的我遇到问题的版本,以下是 stderr 错误信息:
error[E0502]: cannot borrow `my_vec` as immutable because it is also borrowed as mutable
--> src/main.rs:22:30
|
22 | my_vec[0].change_value(my_vec[1].value.as_str());
| ------ ^^^^^^ - mutable borrow ends here
| | |
| | immutable borrow occurs here
| mutable borrow occurs here
因此,借用检查器不允许我两次借用向量(一次作为可变的,然后再作为不可变的),这一点我理解。但令人沮丧的是,我想修改向量中的一个元素,只读取另一个元素。我对Rust还不太熟悉(惊讶!),我不确定自己是否已经完全掌握了所有细节和设计选择。但这是应该能够工作的东西,但实际上却不能。我缺少什么,我应该怎么做才能使它工作(或类似的行为)?任何帮助都将不胜感激!
.split
方法创建了对我的 Vec 的视图,是吗?因此,实际对象仍然留在向量中,但在执行您的代码片段后,它们被更改成我想要的方式? - tronjesplit_first_mut()
返回一个可变引用,指向向量中的第一个元素(该元素仍留在向量中),以及一个可变切片(也可以称为“视图”)。我们只是引用原始数据。 - Lukas Kalbertodt