当前位置: 首页 > 知识库问答 >
问题:

使用Iterator trait编写泛型trait实现,但仅针对不可变的引用实现

谭兴学
2023-03-14

我正在定义一个包含I:

例如:

struct Test;

trait Bar<I> {
    fn bar(&self, i: &I);
}

impl<T, I: IntoIterator<Item=T>> Bar<I> for Test {
    fn bar(&self, i: &I) {
        for x in i {
            println!("woo!");
        }
    }
}

fn main() {
    let vec = vec!(1, 2, 3);
    let test = Test;
    test.bar(&vec);
}

运动场连接

这会导致错误:

<anon>:10:9: 12:10 error: the trait `core::iter::Iterator` is not implemented for the type `&I` [E0277] <anon>:10         for x in i { <anon>:11             println!("woo!"); <anon>:12         } <anon>:10:9: 12:10 help: see the detailed explanation for E0277 <anon>:10:9: 12:10 note: `&I` is not an iterator; maybe try calling `.iter()` or a similar method <anon>:10:9: 12:10 note: required by `core::iter::IntoIterator::into_iter` error: aborting due to previous error playpen: application terminated with error code 101

我一直在玩弄使用Dereftrait来看看我是否能找到工作,但没有用。

我真的希望在函数定义中保留不可变引用,因为这个特性试图对许多类型进行泛型,并使用Bar定义其他实现


共有2个答案

阴雪风
2023-03-14

在Rust中,按照惯例,名称以开头的方法将其参数按值转换为另一个值,通常从原始值重用一些资源。IntoIteratortrait及其intoiter遵循该约定。

你确定你需要使用

struct Test;

trait Bar<I> {
    fn bar(&self, i: I);
}

impl<T, I: IntoIterator<Item=T>> Bar<I> for Test {
    fn bar(&self, i: I) {
        for x in i {
            println!("woo!");
        }
    }
}

fn main() {
    let vec = vec!(1, 2, 3);
    let test = Test;
    test.bar(&vec);
}

游戏场

习海
2023-03-14

I是一个IntoIterator并没有说任何关于

您特别想要绑定

impl<I, T> Bar<I> for Test 
    where for<'a> &'a I: IntoIterator<Item = T>
{
    fn bar(&self, i: &I) {
        for x in i {
            println!("woo!");
        }
    }
}

的代码

这里有一些关于T参数的选择,例如。

  1. into迭代

最好的选择将取决于你用它做什么。对于问题中的具体示例,我会选择3,因为Item类型根本不重要。数字2是有意义的,因为几乎所有具有的类型

 类似资料: