Что означает целая жизнь, когда возвращаешь консервативную черту? - PullRequest
0 голосов
/ 15 мая 2018

При поиске документации о консервативном значении impl , я нашел этот пример :

struct A {
    x: [(u32, u32); 10]
}

impl A {
    fn iter_values<'a>(&'a self) -> impl 'a + Iterator<Item = u32> {
        self.x.iter().map(|a| a.0)
    }
}

Что означает время жизни 'a в типе возврата?

Мне известен вопрос об ограничении времени жизни в Box, но я думаю, что варианты использования разные. Если я хорошо понимаю ответ:

Объект черты действителен только в течение жизни 'a

Это означает, что объект черты, который живет где-то в куче, будет существовать в течение жизни 'a.

Но здесь это не объект-черта, а конкретный объект, который живет в стеке. Поэтому компилятору не нужно иметь подсказки о его времени жизни.

Что мне не хватает в этом?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Это означает, что объект черты, который живет где-то в куче, будет существовать в течение жизни 'a.

Не совсем.

'a здесь точно не указывает, он только устанавливает верхнюю границу времени жизни объекта. Находится ли объект в куче или в стеке, не имеет значения: компилятор должен убедиться, что время жизни этого объекта не превышает 'a.

Время жизни представляет отношение между рефералом и референтом и используется для обеспечения того, чтобы референт никогда не пережил упомянутого. Таким образом, он устанавливает верхнюю границу времени жизни референта и нижнюю границу времени жизни реферата.


Компилятор может получить необходимое время жизни из фактического конкретного типа, возвращаемого функцией, однако для этого потребуется, чтобы средство проверки типов могло просматривать реализацию функции для выполнения своей работы.

Документирование ограничения времени жизни на границе интерфейса, таким образом, является более дружественным как для людей, так и для компилятора: оно допускает локальные рассуждения.

0 голосов
/ 15 мая 2018

Синтаксис impl Iterator<Item = u32> + 'a означает

  • , будет возвращен некоторый тип, определенный функцией, но вы не знаете точный тип.Это часть impl ....
  • неопределенный конкретный тип будет итератором значений u32.Это Iterator<Item = u32> часть.
  • неопределенный конкретный тип может содержать ссылки со временем жизни 'a.Это часть + 'a.

В вашем примере возвращенный итератор содержит ссылки на self, поэтому ему нельзя разрешать жить дольше, чем экземпляр A, иначебыть недействительнымКонкретный тип (если бы мы могли его написать) был бы iter::Map<slice::Iter<'a, (u32, u32)>, <closure>> - обратите внимание, что в нем есть 'a.

Это означает, что объект черты, который живет где-то в куче, будет существоватьпри жизни 'a.

Это не совсем так.Оба случая имеют одинаковое значение: неопределенный конкретный тип может содержать ссылку.С объектом-чертой конкретный тип находится за каким-то указателем (Box, &, Rc и т. Д.).С помощью impl trait конкретный тип помещается непосредственно в стек.

это не объект-черта, а конкретный объект, который живет в стеке

Объекты-черты делаютне требует кучи;они могут использовать только стек:

let x: &std::fmt::Display = &42;
println!("{}", x);

См. также:

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