2016-04-08 16 views
0

ClonedDoubleEndedIterator<Item=&'a T> ancak iter()Iterator<T> (beklediği gibi bir Iterator<&T> yerine) beklediğinde aşağıdaki kod neden çalışıyor?`Cloned` yineleyici bağdaştırıcısı, Iterator <T>` ile çalışır?

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<_>>()); 
} 

cevap

2

T genel bir parametredir ve bunun uygulandığı bir kapsama sahiptir. Spesifik olarak, std::slice::Iter için T parametresi TTreversed bildirilmiştir. Durum böyle olmasaydı, insanların jenerik kullanabilmesinin temel olarak imkansız olacağını düşünüyorum. name olarak adlandırılan her değişken aynı şeyi ifade eder gibi olurdu!

ama iter() Bu doğru olmayan bir Iterator<T>

döndürür; Şu anda bir özellik geri dönemezsiniz. 'un özelliklerini bir özellik olarak döndürebilirsiniz. Ayrıca, std::slice::Iter<T> dönen referanslarla IteratorT için uygular:

impl<'a, T> Iterator for Iter<'a, T> { 
    type Item = &'a T 
} 
+0

"Özellikle, std :: dilim için T parametresi :: Iter T tersine ilan farklıdır" Bu muhtemelen genel durumda doğrudur İkisi arasında bir bağlantı olmadığı zaman, 'DoubleEndedIterator ' içinde 'Item = & 'a T' ifadesinin bu ayrı' T'leri birbirine bağladığının izlenimi altında kaldım. Neyse, cevabınız için teşekkürler, ikinci kısım sorumu yanıtlıyor. –