Dalla libreria standard Rust implementation of unzip
:Qual è lo scopo di SizeHint in Iterator :: unzip?
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB) where
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
Self: Sized + Iterator<Item=(A, B)>,
{
struct SizeHint<A>(usize, Option<usize>, marker::PhantomData<A>);
impl<A> Iterator for SizeHint<A> {
type Item = A;
fn next(&mut self) -> Option<A> { None }
fn size_hint(&self) -> (usize, Option<usize>) {
(self.0, self.1)
}
}
let (lo, hi) = self.size_hint();
let mut ts: FromA = Default::default();
let mut us: FromB = Default::default();
ts.extend(SizeHint(lo, hi, marker::PhantomData));
us.extend(SizeHint(lo, hi, marker::PhantomData));
for (t, u) in self {
ts.extend(Some(t));
us.extend(Some(u));
}
(ts, us)
}
Queste due linee:
ts.extend(SizeHint(lo, hi, marker::PhantomData));
us.extend(SizeHint(lo, hi, marker::PhantomData));
in realtà non si estendono ts
o us
da nulla, in quanto il metodo di SizeHint
rendimenti None
next
. Qual è lo scopo di farlo?
Interessante. Aiuterà se sposto 'let len = self.len(); if len == self.capacity() {let (lower, _) = iterator.size_hint(); self.reserve (lower.saturating_add (1)); } 'parte prima del ciclo while? – qed
In effetti, penso che non abbiamo bisogno di controllare 'self.capacity()', dovrebbe solo andare avanti e riservare. – qed
L'aggiunta di un 'reserve' prima del ciclo è sufficiente per attivare il trucco' unzip'. Rimozione del 'reserve' all'interno del ciclo potrebbe non essere una buona idea. Penso che questo schema aiuti con gli iteratori che continua ad aggiornare 'size_hint' per essere più accurato. – malbarbo