简体   繁体   中英

Does <'a, 'b: 'a> mean that the lifetime 'b must outlive the lifetime 'a?

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?

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 .

Yes, you're broadly right.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM