要求
T: Step
只是达到目的的一种手段,你其实并不在乎
T
机具
Step
,你只在乎
RangeInclusive<T>
是一个迭代器,它产生
t
。你可以准确地表达:
fn mkiter<T>(start: T, end: T) -> Box<dyn Iterator<Item = T>>
where
RangeInclusive<T>: Iterator<Item = T>,
...
编译器仍然抱怨
t
和
步
,但这只是因为你需要遵循相同的原则
.rev()
通过约束工作
DoubleEndedIterator
以及:
fn mkiter<T>(start: T, end: T) -> Box<dyn Iterator<Item = T>>
where
RangeInclusive<T>: Iterator<Item = T> + DoubleEndedIterator,
...
然后就是松散的部分,比如添加
T: PartialOrd
所以
start > end
工作,并添加一个生命周期以绕过
'static
-默认返回
Box<dyn ...>
。这是最终代码:
fn mkiter<'a, T: 'a>(start: T, end: T) -> Box<dyn Iterator<Item = T> + 'a>
where
T: PartialOrd,
RangeInclusive<T>: Iterator<Item = T> + DoubleEndedIterator,
{
if start > end {
Box::new((end..=start).rev())
} else {
Box::new(start..=end)
}
}