Срок действия стоимости против срока заимствования - PullRequest
0 голосов
/ 08 июня 2018

Мне удалось написать и скомпилировать этот код:

trait Runner {}

struct Human {}

impl Runner for Human {}

struct Player<'a, T>
where
    T: Runner + 'a,
{
    t: &'a T,
}

impl<'a, T> AsRef<T> for Player<'a, T>
where
    T: Runner + 'a,
{
    fn as_ref(&self) -> &T {
        self.t
    }
}

fn main() {}

Насколько я понимаю, в определении struct Player T - это какой-то конкретный тип, который реализует черты Runner и TСрок службы 'a долго.t занимает заем T, и заем также 'a долго.

Является ли это понимание правильным?

В определении impl AsRef for Player как компилятор узнает, что время жизни возвращаемого заимствования равно T (из as_ref), где Tвремя жизни 'a должно быть меньше или равно 'a?Какова продолжительность заимствования до self?

1 Ответ

0 голосов
/ 08 июня 2018

Rust собирается успешно, если компилятор может гарантировать, что поля структуры T, являющиеся ссылками, переживают время жизни T.

При таком Player определении:

struct Player<'a, T>
where
    T: Runner + 'a,
{
    t: &'a T,
}
  1. Мы называем 'a сроком действия t.

  2. С 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...