Let's say a Manager
holds references to a Designer
and a Programmer
, but the Programmer
also has to hold a reference to a Designer
, in order to ping them whenever they want.
The problem is, by creating both the Designer
and the Programmer
in Manager::new()
, the &designer
reference doesn't live long enough, since in the following lines, it gets moved inside the Manager
.
The error is 'designer' does not live long enough
.
struct Programmer<'a> {
designer: &'a Designer,
}
impl<'a> Programmer<'a> {
pub fn new(designer: &'a Designer) -> Programmer<'a> {
Programmer { designer: designer }
}
}
struct Designer {
iq: u32,
}
impl Designer {
pub fn new(iq: u32) -> Designer {
Designer { iq: iq }
}
}
struct Manager<'a> {
programmer: Programmer<'a>,
designer: Designer
}
impl<'a> Manager<'a> {
pub fn new() -> Manager<'a> {
let designer = Designer::new(42);
let programmer = Programmer::new(&designer);
Manager { designer: designer, programmer: programmer }
}
}
fn main() {
Manager::new();
}
Compilation fails with this message:
test.rs:29:47: 29:55 error: `designer` does not live long enough
test.rs:29 let programmer = Programmer::new(&designer);
^~~~~~~~
test.rs:27:37: 32:10 note: reference must be valid for the lifetime 'a as defined on the block at 27:36...
test.rs:27 pub fn new() -> Manager<'a> {
test.rs:28 let designer = Designer::new(42);
test.rs:29 let programmer = Programmer::new(&designer);
test.rs:30
test.rs:31 Manager { designer: designer, programmer: programmer }
test.rs:32 }
test.rs:27:37: 32:10 note: ...but borrowed value is only valid for the block at 27:36
test.rs:27 pub fn new() -> Manager<'a> {
test.rs:28 let designer = Designer::new(42);
test.rs:29 let programmer = Programmer::new(&designer);
test.rs:30
test.rs:31 Manager { designer: designer, programmer: programmer }
test.rs:32 }
How could I fix this problem, without injecting the Designer
via Manager::new(&designer)
?