我试图建立这样的东西(playground):
struct X<'a> {
s: &'a str,
}
struct Y<'a> {
list: Vec<X<'a>>,
}
impl<'r> Y<'r> {
fn process(&mut self, e: &'r X) {
// do stuff
}
fn add(&mut self, e: X<'r>) {
self.list.push(e);
let new = self.list.last().unwrap();
self.process(new)
}
}
从概念上看这似乎没问题:self
有一个列表可以添加一个东西,然后我可以对该东西进行一些进一步处理,因为知道该东西应该存在{{1} }。但是,编译器并不同意:
self
在我看来error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
--> src/main.rs:15:29
|
15 | let new = self.list.last().unwrap();
| ^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 13:5...
--> src/main.rs:13:5
|
13 | / fn add(&mut self, e: X<'r>) {
14 | | self.list.push(e);
15 | | let new = self.list.last().unwrap();
16 | | self.process(new)
17 | | }
| |_____^
note: ...so that reference does not outlive borrowed content
--> src/main.rs:15:19
|
15 | let new = self.list.last().unwrap();
| ^^^^^^^^^
note: but, the lifetime must be valid for the lifetime 'r as defined on the impl at 9:1...
--> src/main.rs:9:1
|
9 | impl<'r> Y<'r> {
| ^^^^^^^^^^^^^^
= note: ...so that the types are compatible:
expected &mut Y<'_>
found &mut Y<'r>
应该明确地生活new
(虽然可能没有可变参考self
那么长?),所以我不明白这里的问题。
答案 0 :(得分:0)
fn process(&mut self, e: &'r X) {
此签名看起来非常可疑,可能是错误的。请注意,您没有在此指定X
的生命周期,而是指定它的生命周期。这可能不是你想要的。
答案 1 :(得分:0)
事实证明,我并不了解引用Vec
存储的生命周期是如何工作的。我正在逐步尝试通过可变引用将内容(X
的实例)存储到self
中,同时使用对这些实例的引用将它们存储在self
中。但是,对Vec
的引用仅在Vec
本身不可变时才是稳定的。
因此,解决方案是从Vec
中提取list
(Y
),在初始化Y
对象之前将其初始化,以便它在整个过程中是不可变的Y
对象的生命周期。