Generics 我如何在Rust中编写一个函数来接受任何迭代器,而迭代器的项满足某个特性?

Generics 我如何在Rust中编写一个函数来接受任何迭代器,而迭代器的项满足某个特性?,generics,rust,traits,Generics,Rust,Traits,以下是我试图实现的一个人为的例子: trait Double { fn get(&self) -> i32; } impl Double for i32 { fn get(&self) -> i32 { self * 2 } } fn foo<'a, I: Iterator<Item = &'a Double>>(is: I) { for i in is { println!("{}", i.

以下是我试图实现的一个人为的例子:

trait Double {
    fn get(&self) -> i32;
}

impl Double for i32 {
    fn get(&self) -> i32 { self * 2 }
}

fn foo<'a, I: Iterator<Item = &'a Double>>(is: I) {
    for i in is {
        println!("{}", i.get());
    }
}

fn main() {
    let is = vec![1, 2, 3, 4];
    foo(is.into_iter());
}
这里的错误表示预期的整数变量,found&Double


我很难在谷歌上找到这个,因为到处都在谈论迭代器的特性。我想做的是可能的吗?

是的,是可能的。您需要使用where子句来指定关联类型I::Item的绑定


我还将I:Iterator绑定到where子句,以将所有绑定保持在一起。

是的,这是可能的。您需要使用where子句来指定关联类型I::Item的绑定


我还将I:Iterator绑定到where子句,以将所有绑定保持在一起。

绑定的Iterator绑定的Iteratorah nice,所以这是静态分派是吗?我不想这样做会增加开销。@SamKellett是的,没错,这是静态分派动态分派仅在看到诸如&MyTrait、&mut MyTrait或Boxah nice之类的内容时使用,所以这是静态分派是吗?我不想这样做会带来额外的开销。@SamKellett是的,没错,这是静态分派动态分派仅在看到诸如&MyTrait、&mut MyTrait或box之类的内容时使用。这很好,因为它没有添加额外的类型参数。是的,这比我原来的解决方案要好。我也在我的答案中添加了这个解决方案,因为你已经接受了我的答案。希望你不介意,弗朗西斯,没问题。不过,我们的解决方案并不完全相同:我的版本要求使用double的迭代器,而您的版本要求使用double引用的迭代器;你可能想提一下。@FrancisGagné噢,谢谢你♥ 我没注意到。提到它:这很好,因为它没有添加额外的类型参数Yep,这比我原来的解决方案要好。我也在我的答案中添加了这个解决方案,因为你已经接受了我的答案。希望你不介意,弗朗西斯,没问题。不过,我们的解决方案并不完全相同:我的版本要求使用double的迭代器,而您的版本要求使用double引用的迭代器;你可能想提一下。@FrancisGagné噢,谢谢你♥ 我没注意到。提到它:
fn foo<I>(is: I)
    where I: Iterator,
          I::Item: Double,
{
    for i in is {
        println!("{}", i.get());
    }
}
fn foo<T: MyTrait>(t: &T) {}
fn foo(t: &MyTrait) {}
fn foo<'a, T, I>(is: I) 
    where T: Double,
          I: Iterator<Item = &'a T>,
{
    for i in is {
        println!("{}", i.get());
    }
}
fn foo<I>(is: I) 
    where I: Iterator,
          I::Item: Double,
{ ... }