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 }
        }
}

How Do We Fix These Errors?

 
 
 
 

Why References Aren’t Kept in Sync with the Values’ Locations

 
sitemap

Unable to load book!

The book could not be loaded.

(try again in a couple of minutes)

manning.com homepage