Rust собирается успешно, если компилятор может гарантировать, что поля структуры T
, являющиеся ссылками, переживают время жизни T
.
При таком Player
определении:
struct Player<'a, T>
where
T: Runner + 'a,
{
t: &'a T,
}
Мы называем 'a
сроком действия t
.
С T: Runner + 'a
мы заявляем, что T
реализует Runner
и что все (возможные) ссылки в T
должны пережить 'a
Для вышеуказанногосоображения: если t
время жизни равно 'a
, то время жизни Player
значений строго меньше 'a
.
Позволяет имени 'b
такое Player
значение времени жизни, тогда: 'b < 'a
Как избежать пожизненное разрешение мы можем переписать as_ref
как:
fn as_ref<'b>(&'b self) -> &'b T {
self.t
}
Срок жизни заимствований до self
и возвращенных &T
составляет некоторое время жизни, строго меньшее'a
.