为什么当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<_>>());
}
答案 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
}