Rust 为什么结构字段借用的时间比预期的长

Rust 为什么结构字段借用的时间比预期的长,rust,lifetime,borrow-checker,Rust,Lifetime,Borrow Checker,考虑以下程序。每个元素都应该包含对容器中添加时已经存在的元素的引用 struct元素{ 元素:VecContainer{ 容器{elements:Vec::new()} } fn添加(&'a mut self)->&'a元素{ 让previous=self.elements.iter().collect(); 让元素=元素{previous:previous}; self.element.push(元素); &self.elements[self.elements.len()-1] } } fn

考虑以下程序。每个元素都应该包含对容器中添加时已经存在的元素的引用

struct元素{
元素:VecContainer{
容器{elements:Vec::new()}
}
fn添加(&'a mut self)->&'a元素{
让previous=self.elements.iter().collect();
让元素=元素{previous:previous};
self.element.push(元素);
&self.elements[self.elements.len()-1]
}
}
fn main(){
让mut_c=Container::new();
}
此操作失败并出现错误

error[E0502]: cannot borrow `self.elements` as mutable because it is also borrowed as immutable
  --> nested.rs:17:9
   |
9  | impl <'a>Container<'a> {
   |       -- lifetime `'a` defined here
...
15 |         let previous = self.elements.iter().collect();
   |                        --------------------
   |                        |
   |                        immutable borrow occurs here
   |                        argument requires that `self.elements` is borrowed for `'a`
16 |         let element = Element{previous: previous};
17 |         self.elements.push(element);
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here

error: aborting due to previous error

For more information about this error, try `rustc --explain E0502`.
error[E0502]:无法将'self.elements'借用为可变的,因为它也被借用为不可变的
-->同上,rs:17:9
|
9 | impl{
|--此处定义的生存期“a”
...
15 | let previous=self.elements.iter().collect();
|                        --------------------
|                        |
|不可变借用发生在这里
|参数要求将“self.elements”借用为“a”`
16 | let element=元素{previous:previous};
17 |自我要素。推动(要素);
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^可变借阅发生在此处
错误:由于上一个错误而中止
有关此错误的详细信息,请尝试“rustc--explain E0502”。

但是为什么self.elements是为
'a
借用的呢?我希望它在
collect()之后不再被借用
完成。我希望
self.elements
中的每个元素都会被永久借用,因为它们的引用现在存储在
element.previous
中。但是
self.elements
现在应该可以自由变异了。

错误是:不能借用
self.elements
作为可变元素,因为它也是借用的被认为是不可变的

//这是借用self.selements
let-previous:Vec=self.elements.iter().collect();
previous
从self.elements中借用为不可变


self.elements.push(元素)
使用self.elements
作为可变元素,您不能同时使用可变元素和不可变元素

引用self.elements与引用其中的元素没有功能上的区别。在代码保持原样的情况下,
.push
可以重新分配整个向量,使
上一个
中的所有引用指向inva盖内存位置。