20
votes

I want to implement a builder similar to the debug builders defined by the standard library. They are defined using structures like the following:

struct DebugFoo<'a, 'b: 'a> {
    fmt: &'a mut std::fmt::Formatter<'b>
}

Since I don't understand what the form <'a, 'b: 'a> means nor I can find it mentioned in the Rust book or the Rust reference (at least concerning lifetimes), I just tried to remove what I don't understand to see what happens:

struct DebugFoo<'a, 'b> {
    fmt: &'a mut std::fmt::Formatter<'b>
}

Compiling it I get this error:

in type `&'a mut core::fmt::Formatter<'b>`, reference has a longer 
lifetime than the data it references

And this note:

the pointer is valid for the lifetime 'a as defined on the struct at 1:0
but the referenced data is only valid for the lifetime 'b as defined on
the struct at 1:0

It makes sense to me: 'a and 'b are different lifetimes so, to be on the safe side, Rust (the borrow checker?) assumes that 'a will outlive 'b, and throws the error.

Now I can guess that <'a, 'b: 'a> means that the lifetime 'b must be longer than the lifetime 'a. I've guessed right? Or there is more? How can I find it documented?

2

2 Answers

27
votes

The colon is read "outlives", so

'long: 'short

is read "'long outlives 'short".

As for an official doc on the topic, the only place I've seen it documented so far is in the RFC on lifetime bounds.

9
votes

Yes, you're broadly right.

A bound <...: 'a> means that ... (either a type or another lifetime) needs to be able to outlive 'a. E.g. 'b: 'a means that "'b must live at least as long as 'a" (not strictly outlives, though: they can be the same).