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
被认为是自己借来的吗
如果是,借款的范围是什么?它是最小值(ff
的寿命,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);
}