首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >铁锈:在广义函数中使用IntoIterator

铁锈:在广义函数中使用IntoIterator
EN

Stack Overflow用户
提问于 2022-11-05 07:39:00
回答 1查看 39关注 0票数 0

当我骑自行车时

代码语言:javascript
复制
fn main() {
    let mut a = vec![1,2].into_iter().cycle();
    assert_eq!(a.next().unwrap(), 1);
    assert_eq!(a.next().unwrap(), 2);
    assert_eq!(a.next().unwrap(), 1);
    assert_eq!(a.next().unwrap(), 2);
}

就像我所期望的那样运作良好。但是当我试图把广义函数写成

代码语言:javascript
复制
pub fn cycle_generalized_func<T>(into_iter: T) -> impl Iterator<Item = T::Item>
where
    T: IntoIterator,
    T::Item: Clone,
{
    into_iter.into_iter().cycle()
}

试着用它

代码语言:javascript
复制
let mut a = cycle(vec![1,2]);

id不会使into_iter.into_iter().cycle()行复杂并产生错误,如下所示:

特性绑定<T as IntoIterator>::IntoIter: Clone不满足特性Clone未为<T as IntoIterator>::IntoIterrustcE0277 iterator.rs(3270,23)实现:std::iter::Iterator::cycle main.rs(6,19)中的绑定所需:考虑进一步限制关联类型:, <T as IntoIterator>::IntoIter: Clone

我做错什么了?我不知道怎么修理它

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-05 07:49:13

Iterator::cycle的类型是:

代码语言:javascript
复制
fn cycle(self) -> Cycle<Self>ⓘ
where
    Self: Clone

也就是说,它要求迭代器本身是: Clone,而不是Item。若要修复代码,请将T::Item: Clone替换为T::IntoIter: Clone

这是为我汇编的:

代码语言:javascript
复制
pub fn cycle_generalized_func<T>(into_iter: T) -> impl Iterator<Item = T::Item>
where
    T: IntoIterator,
    T::IntoIter: Clone,
{
    into_iter.into_iter().cycle()
}

如果您需要它来处理不是Clone的迭代器,但是条目是这样的,那么您必须首先将所有条目收集到像Vec这样的容器中:

代码语言:javascript
复制
pub fn cycle_generalized_func<T>(into_iter: T) -> impl Iterator<Item = T::Item>
where
    T: IntoIterator,
    T::Item: Clone,
{
    into_iter
        .into_iter()
        .collect::<Vec<_>>()
        .into_iter()
        .cycle()
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74325975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档