// 在第 3 点仍然借用 s1 的是什么?
你告诉编译器它仍然是借用的,所以它信任你:虽然编译器验证你的生命周期不是太短,但它并不真正关心它们是否太长而导致东西无法使用。
当你写的时候&'a mut self
, the 'a
是在impl
块,因此是在结构上定义的块。&'a mut self
:
self: &'a mut Struct1<'a>
所以一旦你打电话func()
rust 编译器会说“好吧,这是借来的'a
这是与相关的生命周期s1
这是'static
,所以这是可变地永远借用的,美好的一天”,因此你被“锁定”在结构之外。
事实上,您可以通过尝试显式声明一个来看到此别名'a
on func
:
pub fn func<'a>(&'a mut self) -> () {
()
}
error[E0496]: lifetime name `'a` shadows a lifetime name that is already in scope
--> src/main.rs:11:17
|
5 | impl<'a> Struct1<'a> {
| -- first declared here
...
11 | pub fn func<'a>(&'a mut self) -> () {
| ^^ lifetime `'a` already in scope
error: aborting due to previous error
所以 Rust 毫不含糊地告诉你,在区块内'a
始终指的是声明的生命周期impl
block.
解决办法就是直接删除'a
,这完全是错误的生命周期:
pub fn func(&mut self) -> () {
()
}
在这种情况下,rustc 将自动引入生命周期,并且由于该函数实际上并没有借用任何东西,因此生命周期只会扩展到函数调用。