Rust 将自我的生命周期与方法中的引用联系起来

Rust 将自我的生命周期与方法中的引用联系起来,rust,Rust,我有: 这将导致以下错误: error[E0502]:无法将'f'作为不可变项借用,因为它也是作为可变项借用的 -->src/main.rs:21:31 | 19 | f.集和w; |-此处发生可变借用 20 | 21 | println!(“现在f是{:?}”,f); |^此处发生不可变借用 22 | } |-可变借用结束于此 与上面的示例相反,f在第二次打印时仍然被认为是可变借用的!被调用,因此它不能作为不可变项同时借用 这是怎么发生的 在第一个示例中,编译器没有省略生存期注释,为我填写

我有:

这将导致以下错误:

error[E0502]:无法将'f'作为不可变项借用,因为它也是作为可变项借用的
-->src/main.rs:21:31
|
19 | f.集和w;
|-此处发生可变借用
20 | 
21 | println!(“现在f是{:?}”,f);
|^此处发生不可变借用
22 | }
|-可变借用结束于此
与上面的示例相反,
f
在第二次打印时仍然被认为是可变借用的!被调用,因此它不能作为不可变项同时借用

这是怎么发生的

在第一个示例中,编译器没有省略生存期注释,为我填写了一个
&mut self
。这是根据终身省略的规则发生的。然而,在第二个示例中,通过显式地将其设置为
'a
,我将
f
的值的寿命与
w
的值联系起来

f
被认为是自己借来的吗

如果是,借款的范围是什么?它是最小值(f
f
的寿命,
w
的寿命)->f
的寿命吗

我假设我还没有完全理解函数调用中的
&mut self
引用。我的意思是,函数返回,但是
f
仍然被认为是借用的

我试图完全理解人生。我主要是寻找关于我对概念理解的纠正性反馈。我非常感谢各位的建议和进一步澄清

在调用方法
set
时,使用impl块上的生存期参数,并为方法签名中的
'a
填写
w
值的生存期

否。生存期参数
'a
的值在创建
Foo
结构时是固定的,并且永远不会更改,因为它是其类型的一部分

在您的例子中,编译器实际上为
'a
选择了一个与
v
w
的生存期兼容的值。如果这是不可能的,它将失败,例如在本例中:

fn main() {
    let v = 5;
    let mut f = Foo { x: &v };

    println!("f is {:?}", f);
    let w = 7;
    f.set(&w);

    println!("now f is {:?}", f);
}
哪些产出:

错误[E0597]:`w`活得不够长
-->src/main.rs:21:1
|
18 | f.组和w;
|-借用发生在这里
...
21 | }
|^`w`在还借来的时候就掉在这里了
|
=注意:范围中的值按与创建顺序相反的顺序删除
正是因为
v
施加的
'a
寿命与
w
的较短寿命不兼容


在第二个示例中,通过强制
self
的生存期也为
'a
,您也将可变借用绑定到生存期
'a
,因此,当生存期
'a
的所有项目都超出范围时,即
v
w
时,借用结束。因此,在第一个示例中,如果该值在创建时是固定的,编译器也会考虑方法调用中的赋值来确定“a”。但是‘a’至少必须和f@JonasTepe的寿命一样长。是的,就是这样。从这一点来看,第二个例子现在也很有意义。非常感谢。@Levans示例现在已编译完毕
impl<'a> Foo<'a> {
    fn set(&'a mut self, r: &'a i32) {
        self.x = r;
    }
}
fn main() {
    let v = 5;
    let mut f = Foo { x: &v };

    println!("f is {:?}", f);
    let w = 7;
    f.set(&w);

    println!("now f is {:?}", f);
}