Self::Target это ассоциированный тип типажа (трэйта). Self указывает на сам тип(аж), оператор :: и капитализированный идентификатор после него на то что идет доступ к ассоциированному типу. Что такое ассоциированный тип лучше почитать в хорошей документации, я большой противник наспех разжевываемой в комментариях информации, относящейся к фундаментальным знаниям.
Как минимум такая запись удобна для рефакторинга: если тип таргета изменится, достаточно будет его поменять только в том месте, где он определен. Как максимум это удобно и для понимания кода, потому что видишь, что, ага, используется ассоциированный тип, а не какой-то произвольный.
Так как вы хотите - сделать нельзя. Потому что итератор (в текущем его виде в стандартной библиотеке Rust) не может вернуть ссылку на данные, которыми он владеет (нет связи времён жизни между возвращаемым значением в сигнатуре функции next и ассоциированным типом). Поэтому в std и в различных крейтах - в большинстве случаев есть промежуточный тип, который не владеет данными и для которого и реализуется Iterator, а создаётя этот промежуточный тип с помощью имплементации на типе IntoIterator. В вашем случае тип данных является владельцем данных и для него же производится попытка реализовать трэйт Iterator.
Пример того, как можно сделать:
struct Example {
value: Vec<u8>,
}
struct IteratorExample<'a> {
value: &'a [u8],
}
impl<'a> Iterator for IteratorExample<'a> {
type Item = &'a [u8];
fn next(&mut self) -> Option<Self::Item> {
// а такой код не работает
Some(&self.value[..3])
// None
}
}
impl<'a> IntoIterator for &'a Example {
type Item = &'a [u8];
type IntoIter = IteratorExample<'a>;
fn into_iter(self) -> Self::IntoIter {
IteratorExample {
value: &self.value
}
}
}
fn main() {
let der = Example {
value: vec![0, 1, 2, 3, 4, 5, 6, 7],
};
let mut iter = der.into_iter();
println!("{:?}", iter.next());
println!("{:?}", iter.next());
println!("{:?}", iter.next());
}
P.S
А теперь ссылка касательно того, почему сейчас этого сделать нельзя: https://github.com/rust-lang/rfcs/blob/master/text/1598-generic_associated_types.md#motivation
Ждём конструкторов ассоциированных типов (часть HKT). В найтли это уже есть и можно опробовать с помощью включения флага: #![feature(generic_associated_types)]
Оно пока анстейбл и может вызывать поломку компилятора. И даже в том случае, если это реализуют и стабилизируют, не понятно когда стриминг итераторы заедут в std.