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?
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).The colon is read "outlives", so
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.