2016-04-08 45 views
0

爲什麼當Cloned預期DoubleEndedIterator<Item=&'a T>iter()返回Iterator<T>(而不是它所期望的Iterator<&T>)時,下面的代碼工作?`Cloned`迭代器適配器如何與`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<_>>()); 
} 

回答

2

T是通用參數,它有一個適用範圍。具體而言,std::slice::IterT參數是不同的reversed上聲明的T。如果情況並非如此,我認爲人類基本上不可能使用仿製藥。這就好像每個名爲name的變量都指向相同的東西!

iter()返回Iterator<T>

這是不正確的;你目前無法返回特質。你只能返回一個實現特性的類型。此外,std::slice::Iter<T>實現Iterator通過返回引用T

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

「具體來說,的std ::片T參數::國際核聚變實驗堆不同從T上扭轉宣佈」 這可能是在一般情況下,真正的當兩者之間沒有聯繫時,但我在'DoubleEndedIterator '中說'Item =&'a T''的印象是鏈接了這些單獨的'T'。 無論如何感謝您的回覆,第二部分回答我的問題。 –

相關問題