Generics 如何从函数返回关联类型为泛型的迭代器?

Generics 如何从函数返回关联类型为泛型的迭代器?,generics,rust,iterator,traits,parametric-polymorphism,Generics,Rust,Iterator,Traits,Parametric Polymorphism,对于这样的函数: fn generate_even(a: i32, b: i32) -> impl Iterator<Item = i32> { (a..b).filter(|x| x % 2 == 0) } 如何实现这样的功能?使用std::ops::Range; 使用std::ops::Rem; 使用std::cmp::PartialEq; fn生成偶数(a:T,b:T)->impl迭代器 哪里 范围:迭代器, T:复制+Rem+从+PartialEq { 设零:

对于这样的函数:

fn generate_even(a: i32, b: i32) -> impl Iterator<Item = i32> {
    (a..b).filter(|x| x % 2 == 0)
}
如何实现这样的功能?

使用std::ops::Range;
使用std::ops::Rem;
使用std::cmp::PartialEq;
fn生成偶数(a:T,b:T)->impl迭代器
哪里
范围:迭代器,
T:复制+Rem+从+PartialEq
{
设零:T=0_u8.into();
设二:T=2_u8.into();
(a..b).过滤器(移动|&x | x%two==零)
}
fn main(){
设偶数_u8s=生成_偶数(0_u8,11_u8);
设偶数=生成偶数(0,11);
设偶数=生成偶数(0,11);
//等等
设偶数=生成偶数(0,11);
}

解决方案中最困难的部分是以通用方式实现
x%2==0
,因为默认情况下,Rust将整数文本解释为
i32
s,但您希望函数在所有可能的整数类型中都是通用的,这意味着您必须生成调用方指定的任何整数类型的
2
0
值,最简单的方法是通过
From
绑定
T
,这允许我们将
0
256
的任何值转换为任何整数类型(唯一的例外是
i8
). 上述解决方案是通用的,适用于除
i8

使用std::ops::Range之外的所有整数类型;
使用std::ops::Rem;
使用std::cmp::PartialEq;
fn生成偶数(a:T,b:T)->impl迭代器
哪里
范围:迭代器,
T:复制+Rem+从+PartialEq
{
设零:T=0_u8.into();
设二:T=2_u8.into();
(a..b).过滤器(移动|&x | x%two==零)
}
fn main(){
设偶数_u8s=生成_偶数(0_u8,11_u8);
设偶数=生成偶数(0,11);
设偶数=生成偶数(0,11);
//等等
设偶数=生成偶数(0,11);
}


解决方案中最困难的部分是以通用方式实现
x%2==0
,因为默认情况下,Rust将整数文本解释为
i32
s,但您希望函数在所有可能的整数类型中都是通用的,这意味着您必须生成调用方指定的任何整数类型的
2
0
值,最简单的方法是通过
From
绑定
T
,这允许我们将
0
256
的任何值转换为任何整数类型(唯一的例外是
i8
). 上述解决方案是通用的,适用于除
i8

之外的所有整数类型。实际上,通过使用
TryInto
可以支持所有整数类型,包括
i8

使用std::ops::Range;
使用std::ops::Rem;
使用std::cmp::PartialEq;
使用std::fmt;
使用std::convert::{TryFrom,TryInto};
fn生成偶数(a:T,b:T)->impl迭代器
哪里
范围:迭代器,
T:Copy+Rem+TryFrom+PartialEq+fmt::Debug,
::错误:fmt::调试
{
让零:T=0_u8。尝试将_放入()中。展开();
让两个:T=2_u8。试着打开();
(a..b).过滤器(移动|&x | x%two==零)
}
fn main(){
设偶数=生成偶数(0,11,8);
设偶数_u8s=生成_偶数(0_u8,11_u8);
设偶数=生成偶数(0,11);
设偶数=生成偶数(0,11);
//等等
设偶数=生成偶数(0,11);
}

使用
TryInto
实际上可以支持所有整数类型,包括
i8

使用std::ops::Range;
使用std::ops::Rem;
使用std::cmp::PartialEq;
使用std::fmt;
使用std::convert::{TryFrom,TryInto};
fn生成偶数(a:T,b:T)->impl迭代器
哪里
范围:迭代器,
T:Copy+Rem+TryFrom+PartialEq+fmt::Debug,
::错误:fmt::调试
{
让零:T=0_u8。尝试将_放入()中。展开();
让两个:T=2_u8。试着打开();
(a..b).过滤器(移动|&x | x%two==零)
}
fn main(){
设偶数=生成偶数(0,11,8);
设偶数_u8s=生成_偶数(0_u8,11_u8);
设偶数=生成偶数(0,11);
设偶数=生成偶数(0,11);
//等等
设偶数=生成偶数(0,11);
}

限制最严格的部分不是范围,它可以简单地通过
进行限制,其中std::ops::range:Iterator
,或者对所有迭代器实现的过滤器,而是
x%2==0
,它要求对数字使用,这可能需要类似于
num\u traits
的内容。您可以将
T
绑定为on以允许modula运算符。每个操作符都有一个特点。@PitaJ但是RHS会采用什么类型呢?@PitaJ它将与
a
的类型相同。限制最严格的部分不是范围,它可以通过
where std::ops::range:Iterator
或过滤器来限制,该过滤器是为所有迭代器实现的,但是
x%2==0
,这要求它用于数字,这可能需要类似于
num\u traits
的内容。您可以将
T
绑定为on以允许modula运算符。每个操作员都有一个特点。@PitaJ但是RHS会采用什么类型呢?@PitaJ它会与
a
fn generate_even(a: T, b: T) -> impl Iterator<Item = T>
    where T: // range + filter + what to put here?
{
    (a..b).filter(|x| x % 2 == 0)
}