Rust 什么';不可变引用和可变引用的生存期有什么区别?

Rust 什么';不可变引用和可变引用的生存期有什么区别?,rust,reference,lifetime,Rust,Reference,Lifetime,有一个结构定义如下 struct测试{ 酒吧fn共享借阅(&'a self){ println!(“{}”,self.t); } 酒吧fn可变借阅(&'a mut self){ println!(“{}”,self.t); } } 案例1。如果在可变借阅()之前调用共享借阅(),则可以通过借阅检查 fn main(){ 设mut x=Test{t:“Test”}; x、 共享_借用(); x、 可变的; } 案例2。如果我按如下方式交换方法调用的顺序,它将失败 fn main(){ 设mut

有一个结构定义如下

struct测试{
酒吧fn共享借阅(&'a self){
println!(“{}”,self.t);
}
酒吧fn可变借阅(&'a mut self){
println!(“{}”,self.t);
}
}
案例1。如果在可变借阅()之前调用共享借阅(),则可以通过借阅检查

fn main(){
设mut x=Test{t:“Test”};
x、 共享_借用();
x、 可变的;
}
案例2。如果我按如下方式交换方法调用的顺序,它将失败

fn main(){
设mut x=Test{t:“Test”};
x、 可变的;
x、 共享_借用();
}
编译器的输出:

error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable
  --> src/main.rs:16:5
   |
15 |     x.mutable_borrow();
   |     - mutable borrow occurs here
16 |     x.shared_borrow();
   |     ^
   |     |
   |     immutable borrow occurs here
   |     mutable borrow later used here

error: aborting due to previous error
正如我所知,shared_borrow()和mutable_borrow()都在x的整个生存期中借用x,因为生存期被显式声明为“a”,即x的生存期


在案例1中,x.shared_borrow()将在x的整个生命周期内借用x。因此,在此之后不允许调用x.mutable_borrow()。我不明白为什么编译器没有像案例2中那样报告错误。

这是否回答了您的问题?@亚历克斯·拉里奥诺夫,我不这么认为。这里,生命周期被显式声明为“a”,这是x的生命周期。如我所知,在案例1中,x.shared_borrow()将在x的整个生命周期内借用x。因此,在此之后不允许调用x.mutable_borrow()。我很困惑为什么编译器没有像案例2中那样报告错误。我也合理地认为案例1应该失败。好奇地想知道为什么没有;dr复制(但实际上您还是应该阅读):
&a mut self
(其中
'a
是在外部范围中声明的生存期)实际上总是一个错误<代码>&“自我”应该很少见。99%的时间,
self
应该有一个新的生存期。Re:在案例1中,x.shared_borrow()将在x的整个生存期内借用x,不,它不会。
x
的生存期可以在共享借阅后“缩短”,副本的答案也解释了这一点。