лайфтайм ('tmp), чтобы показать, что он живет меньше 'a
struct Revolver<'a, T>(Vec<&'a T>);
//T - large object
impl<'a,T> Iterator for Revolver<'a,T> {
type Item = &'tmp [&'a T];
fn next(&mut self) -> Option<Self::Item> {
let mut buf = self.0.into_iter().cycle().skip(1).collect();
std::mem::swap(&mut buf, &mut self.0);
Some(self.0.as_slice())
}
}
Так не работает, ты пытаешься вернуть ссылку на то, что лежит в self, а интерфейс Iterator подразумевает, что возвращаемое значение на self не завязано лайфтамом
а каким образом он это "подразумевает"?
fn next(&mut self) -> Option<Self::Item> В возвращаемом типе ничего про времена жизни нету
Ну так Self::Item почему не может быть с ссылкой?
Не то чтобы не может, но у deref сигнатура (&self) -> &Self::Target, то есть возвращаемый тип — это уже ссылка. Если в качестве Target выбрать тип с ссылкой, то возвращать придётся ссылку на сссылку. Так как вернуть ссылку на что-то локальное в Rust нельзя, возвращаемая ссылка должна уже быть в типе
не понял, причем тут deref
Обсуждают сегодня