Warum funktioniert der folgende Code, wenn Cloned
einen DoubleEndedIterator<Item=&'a T>
erwartet, aber iter()
gibt Iterator<T>
zurück (anstelle von Iterator<&T>
wie erwartet)?Wie funktioniert der Iterator-Adapter "Cloned" mit "Iterator <T>"?
use std::clone::Clone;
use std::iter::{Rev, Cloned};
use std::fmt::Debug;
fn reversed<'a, U, T>(iter: U) -> Rev<Cloned<U>>
where U: DoubleEndedIterator<Item=&'a T>,
T: 'a + Clone + Debug
{
iter.cloned().rev()
}
fn main() {
let v0 = (0..10).collect::<Vec<u32>>();
let mut v0r = v0.clone();
v0r.reverse();
assert_eq!(v0r, reversed(v0.iter()).collect::<Vec<_>>());
}
„Insbesondere die T-Parameter für std :: Scheibe :: Iter unterscheidet sich von der T auf Umkehr erklärt“ Das ist wohl wahr, im allgemeinen Fall wenn es keine Verbindung zwischen den beiden gibt, hatte ich den Eindruck, dass 'Item = & 'ein T' in' DoubleEndedIterator- 'diese separaten' T's verknüpft. Trotzdem vielen Dank für Ihre Antwort, der zweite Teil beantwortet meine Frage. –