为什么以下代码在Cloned
期望DoubleEndedIterator<Item=&'a T>
而iter()
返回Iterator<T>
(而不是期望的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<_>>());
}
T
是泛型参数,它有一个应用范围。具体而言,std::slice::Iter
的T
参数与在reversed
上声明的T
不同。如果不是这样的话,我认为人类基本上不可能使用仿制药。这就像每个名为name
的变量都引用了相同的东西!
但是CCD_ 12返回CCD_
这不是真的;您当前无法返回特征。您只能返回实现特征的类型。此外,std::slice::Iter<T>
通过返回对T
:的引用来实现Iterator
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T
}