你想把
DoubleEndedIterator
绑定在迭代器类型上,而不是可迭代类型(即实现的类型
IntoIterator
). 例如,对于
FirstList
,您需要将绑定写为
FirstList::IntoIter: DoubleEndedIterator<Item = &'a FirstItemType>,
.
IntoIter
是在上定义的关联类型
IntoIterator
特质。
也,
first_list.rev().into_iter().peekable()
需要更改为
first_list.into_iter().rev().peekable()
因为
rev()
未由定义
IntoIterator
特质。
pub fn ends_with<'a, 'b, FirstList, FirstItemType, SecondList, SecondItemType, BinaryPredicate>(
first_list: FirstList,
second_list: SecondList,
binary_predicate: BinaryPredicate,
) -> bool
where
FirstList: IntoIterator<Item = &'a FirstItemType>,
FirstList::IntoIter: DoubleEndedIterator<Item = &'a FirstItemType>,
FirstItemType: 'a,
SecondList: IntoIterator<Item = &'b SecondItemType>,
SecondList::IntoIter: DoubleEndedIterator<Item = &'b SecondItemType>,
SecondItemType: 'b,
BinaryPredicate: Fn(&FirstItemType, &SecondItemType) -> bool,
{
let mut f_itr = first_list.into_iter().rev().peekable();
let mut s_itr = second_list.into_iter().rev().peekable();
while let (Some(f), Some(s)) = (f_itr.peek(), s_itr.peek()) {
if !binary_predicate(*f, *s) {
return false;
}
let _ = f_itr.next();
let _ = s_itr.next();
}
f_itr.peek().is_some() || s_itr.peek().is_none()
}
fn main() {
let first_list = vec![1, 2, 3, 4, 5, 6];
let second_list = vec![4, 5, 6];
let res = ends_with(&first_list, &second_list, |first_item, second_item| {
*first_item == *second_item
});
assert!(res);
}