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
的生存期可以在共享借阅后“缩短”,副本的答案也解释了这一点。