when rust lifetimes finally click

11 July 2020. Estimated reading time: 2 min.

I started learning Rust by reading the Book, cover to cover. Lifetimes were far from the hardest topic for me to get used to, and I even took care to make a mental note that

Lifetime annotations don’t change how long any of the references live.

So I was very surprised to realize that, a few days later, I had no idea what my custom error types were supposed to return when implementing Error::source.

fn source(&self) -> Option<&(dyn Error + 'static)>;

Let's try to translate this: source returns an Option over a reference to a trait object that implements the Error trait and has static lifetime.

Option and reference, fine. I have to admit I'd already forgotten about trait objects (I could remember why they were necessary, not their syntax or name), but they were easy to look up.

However, doesn't 'static means that the value has to live until the program ends? Aren't constants the things with static lifetimes?

First, no. Second, constants have static lifetimes, but aren't the only things that do.

A static lifetime means a value that may live indefinitely, if required to. And the most common values with static lifetimes are... owned values, unless they explicitly depend on other values with shorter lifetimes.

So the returned value from source can be understood as an Option over a reference to an Error-like value, that either owns all their memory or that is otherwise guaranteed to live for as long as it is necessary.

This is what made lifetimes finally click to me. I think...

By the way, I discovered that owned values are 'static in a reply on the Rust discord logs; other people have gotten stuck on Error + 'static trait objects.

Last updated: 08 June 2021.