如何解决此错误?当我在 impl Game 上指定生命周期且结构体已经有生命周期时,我究竟要告诉编译器什么?
我怀疑您的困惑源于对 Rust 中声明和使用生命周期的方式的不完全理解。
结构生命周期
为了在结构上使用生命周期,您declare里面的生命周期<>
与您要声明的结构的名称相邻,然后refer到结构定义中的生命周期。重要的是,请注意,此处声明的生命周期仅限于结构定义 - 它在外部没有任何意义。
例如(使用@Shepmaster提供的MRE):
struct Game<'a> {
handlers: Vec<&'a str>,
}
结构体Game
包含对字符串的引用向量,并且引用的字符串必须至少与Game
struct.
实现生命周期
在 impl 块上使用生命周期说明符时,您declare里面的生命周期<>
紧邻 impl 关键字,之后您可以refer到正在实现的结构体和实现本身内部的生命周期,如下所示:
impl<'b> Game<'b> {
fn match_str(&mut self, label: &'b str) {
self.handlers.push(label);
}
}
请注意,我在这里使用了完全不同的生命周期名称('b
) 来说明结构体上的生命周期声明独立于 impl 块上的生命周期声明。
分解一下:
impl<'b>
这意味着我们正在定义结构体的实现,并且在该定义中我们将使用生命周期'b
Game<'b> {
这意味着 impl 用于结构体Game
与一生'b
-所以任何参考self
在这个实现中将自动具有生命周期'b
以及。
fn match_str(&mut self, label: &'b str) {
这里我们定义方法match_str
这需要一个参数label
. label
是一个字符串切片,它也有生命周期'b
- 所以它必须至少持续self
该方法被调用。
在你的原始代码中,你有这样的东西:
impl Game<'_> {
fn match_str<'a>(&mut self, label: &'a str) {
...
}
}
这是告诉编译器:
- 您正在启动一个新的 impl 块,并且在 impl 级别没有声明生命周期
- 该实现是针对结构的
Game
;这个结构有一个生命周期参数,但我们不关心它,也不会将它与实现的任何元素联系起来
- 我们正在定义一个方法
match_str
,我们宣布一生'a
我们可以在函数签名的其余部分中引用它
- 我们有一个争论
label
哪个有寿命a
,但我们不会将这一生与其他任何事情联系起来
更多信息:
- Rust Book - 结构定义中的生命周期注释 https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html#lifetime-annotations-in-struct-definitions
- Rust Book - 方法定义中的生命周期注释 https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html#lifetime-annotations-in-method-definitions