Chapter 4. Why You Can’t Store a Value and a Reference to that Value in the Same Struct
Let’s say we have a value and we want to store that value and a reference to something inside that value in our own type:
struct Thing { count: u32, } struct Combined<‘a>(Thing, &’a u32); fn make_combined<‘a>() -> Combined<‘a> { let thing = Thing { count: 42 }; Combined(thing, &thing.count) }
Or say we have a value and we want to store that value and a reference to that value in the same structure:
struct Combined<‘a>(Thing, &’a Thing); fn make_combined<‘a>() -> Combined<‘a> { let thing = Thing::new(); Combined(thing, &thing) }
Or a case when we’re not even taking a reference of the value:
struct Combined<‘a>(Parent, Child<‘a>); fn make_combined<‘a>() -> Combined<‘a> { let parent = Parent::new(); let child = parent.child(); Combined(parent, child) }
In each of these cases, we get an error that one of the values “does not live long enough”. What does this error mean?
Let’s look at a simple implementation of this:
struct Parent { count: u32, } struct Child<‘a> { parent: &’a Parent, } struct Combined<‘a> { parent: Parent, child: Child<‘a>, } impl<‘a> Combined<‘a> { fn new() -> Self { let parent = Parent { count: 42 }; let child = Child { parent: &parent }; Combined { parent, child } } }