2016-04-08 9 views
0

ClonedDoubleEndedIterator<Item=&'a T>を期待しているのにiter()Iterator<T>(期待どおりIterator<&T>の代わりに)を返すと、次のコードが機能するのはなぜですか?`Iterator <T>`で `Cloned`イテレータアダプタはどのように動作しますか?

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パラメータは、と宣言されているTのとは異なるです。これが当てはまらない場合は、人間がジェネリック医薬品を使用することは基本的に不可能だと私は考えます。 nameと呼ばれるすべての変数が同じものを参照していたようなものです!

が、これは真実ではありませんIterator<T>

iter()返します。あなたは現在、形質を返すことができません。 の特性を実装するタイプのみを返すことができます。さらに、std::slice::Iter<T>Tへの参照を返すことによってIteratorを実装します。

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

「のstd具体的には、Tパラメータ::スライスを::イーターが逆転で宣言さTと異なっている」これは一般的なケースでは、おそらく真実である 両者の間にリンクがないとき、私は 'DoubleEndedIterator 'の 'Item =& 'a T'がこれらの別々の' T 'をリンクしているという印象を受けました。 お返事いただきありがとうございます。第2部が私の質問にお答えします。 –

関連する問題