我正在做一些关于生命周期和借阅判断器的实验.想象一下第一个 struct :
struct First {}
impl First {
fn new() -> Self {
Self {}
}
fn second(&self) -> Second {
Second::new(self)
}
fn hello(&self) {
println!("Hello");
}
}
第二个,它的生命周期 限制取决于First
:
struct Second<'a> {
owner: &'a First,
}
impl<'a> Second<'a> {
fn new(owner: &'a First) -> Self {
Self { owner }
}
fn hello(&self) {
self.owner.hello();
}
}
上面的代码运行得非常好:Second
是由First
创建的,它不能比First
更长寿.
问题
现在让我们修改Second
,这样它就可以创建第三个 struct Third
:
struct Second<'a> {
owner: &'a First,
}
impl<'a> Second<'a> {
fn new(owner: &'a First) -> Self {
Self { owner }
}
fn third(&self) -> Third {
Third::new(self.owner)
}
fn hello(&self) {
self.owner.hello();
}
}
Third
本身,也取决于First
:
struct Third<'a> {
owner: &'a First,
}
impl<'a> Third<'a> {
fn new(owner: &'a First) -> Self {
Self { owner }
}
fn hello(&self) {
self.owner.hello();
}
}
我可以想象,当创建一个Third
的实例时,它将依赖于First
,但事实并非如此.实际上Third
取决于Second
:
fn main() {
let f = First::new();
let t = {
let sss = f.second();
sss.third() // error: sss does not live long enough
};
}
那么,我如何使生命周期约束从First
"通过"到Third
?