Подтвердить что ты не робот

Имеет ли значение <a, b: a означает, что время жизни b должно пережить время жизни a?

Я хочу реализовать построитель, похожий на debug builders, определенный стандартной библиотекой. Они определяются с использованием таких структур, как:

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

Так как я не понимаю, что означает форма <'a, 'b: 'a>, и я не могу найти ее в книге Rust или ссылке Rust (по крайней мере, относительно сроков жизни), я просто попытался удалить то, что я не понимаю, чтобы увидеть что происходит:

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

Составив его, я получаю эту ошибку:

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

И это примечание:

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

Имеет смысл для меня: 'a и 'b - разные времена жизни, поэтому, чтобы быть в безопасности, Rust (средство проверки займа?) предполагает, что 'a переживет 'b и выдает ошибку,

Теперь я могу предположить, что <'a, 'b: 'a> означает, что время жизни 'b должно быть больше времени жизни 'a. Я правильно понял? Или есть еще? Как я могу найти его документированным?

4b9b3361

Ответ 1

Двоеточие читается "переживает", поэтому

'long: 'short

читается "'long переживает 'short".

Что касается официального документа по этой теме, единственное место, которое я видел в этом документе, находится в RFC на границах жизни.

Ответ 2

Да, вы в целом правы.

Связанная <...: 'a> означает, что ... (либо тип, либо другое время жизни) должен иметь возможность пережить 'a. Например. 'b: 'a означает, что "'b должен проживать, по крайней мере, до тех пор, пока 'a" (не сильно переживает, хотя: они могут быть одинаковыми).