#[derive(Debug)]
struct Foo<'a> {
x: &'a i32,
}
impl<'a> Foo<'a> {
fn set(&mut self, r: &'a i32) {
self.x = r;
}
}
fn main() {
let v = 5;
let w = 7;
let mut f = Foo { x: &v };
println!("f is {:?}", f);
f.set(&w);
println!("now f is {:?}", f);
}
我的理解是,在值v
的第一次borrow 中,struct声明中的泛型生存期参数'a
被填充为值v
的生存期.这意味着生成的Foo
对象的生命周期 不得超过'a
的生命周期 ,或者v
的值必须至少与Foo
对象的生命周期 相同.
在对方法set
的调用中,使用impl
块上的生存期参数,并在方法签名中为'a
填充值w
的生存期.编译器为&mut self
分配了不同的生存期,即f
(Foo
对象)的生存期.如果在main
函数中切换w
和f
的绑定顺序,这将导致错误.
我想知道如果我在set
方法中使用与r
相同的生命周期参数'a
注释&mut self
引用,会发生什么:
impl<'a> Foo<'a> {
fn set(&'a mut self, r: &'a i32) {
self.x = r;
}
}
这将导致以下错误:
error[E0502]: cannot borrow `f` as immutable because it is also borrowed as mutable
--> src/main.rs:21:31
|
19 | f.set(&w);
| - mutable borrow occurs here
20 |
21 | println!("now f is {:?}", f);
| ^ immutable borrow occurs here
22 | }
| - mutable borrow ends here
与上面的例子相反,在第二次打印时,f
仍然被认为是可变borrow 的!被调用,因此它不能作为不变的同时被borrow .
这是怎么回事?
在第一个例子中,编译器没有省略生命周期注释,为我填写了一个&mut self
.这是根据终身省略的规则发生的.然而,在第二个例子中,通过显式地将其设置为'a
,我将f
和w
的生命周期 联系起来.
不知何故,f
被认为是自己借来的吗?
And if so, what is the scope of the borrow? Is it min(lifetime of f
, lifetime of w
) -> lifetime of f
?
我想我还没有完全理解函数调用中的&mut self
引用.我的意思是,函数返回,但f
仍然被认为是borrow 的.
我正在努力完全理解人生.我主要是寻找关于我对概念理解的纠正性反馈.我非常感谢您提供的每一点建议和进一步的澄清.