`Cloned`迭代器适配器如何与`Iterator <t>`一起工作?

时间:2016-04-08 16:58:00

标签: rust

为什么当Cloned期望DoubleEndedIterator<Item=&'a T>iter()返回Iterator<T>(而不是预期的Iterator<&T>时,以下代码有效?< / p>

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

1 个答案:

答案 0 :(得分:2)

T是通用参数,它具有适用的范围。具体而言,[XmlRoot("header")]T参数与T上声明的reversed 不同。如果情况并非如此,我认为人类基本上不可能使用仿制药。如果每个名为name的变量引用相同的东西就好了!

  

iter()会返回Iterator<T>

这不是真的;你目前无法恢复特质。您只能返回实现特征的类型。此外,std::slice::Iter<T>通过返回对Iterator的引用来实现T

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