在迭代器上创建以Rust格式返回迭代器的方法

在迭代器上创建以Rust格式返回迭代器的方法,rust,iterator,Rust,Iterator,我想定义一个lazysquare()方法,它没有不必要的运行时开销(nodyn关键字),可以在任何Iterable上调用,并返回另一个Iterable,如下所示: fn main(){ vec![1,2,3,4,5] .国际热核实验堆(iter) .filter(|x | x>1) .squared() .过滤器(|x | ximpl迭代器{ iter.map(|x | x*x) } 但是,要在迭代器上定义该方法,我必须首先定义一个trait。 这就是我奋斗的地方 — traits不能在返回值

我想定义一个lazy
square()
方法,它没有不必要的运行时开销(no
dyn
关键字),可以在任何
Iterable
上调用,并返回另一个
Iterable
,如下所示:

fn main(){
vec![1,2,3,4,5]
.国际热核实验堆(iter)
.filter(|x | x>1)
.squared()
.过滤器(|x | x<20);
}
我知道如何将
squared()
定义为独立函数:

fn平方(iter:I)->impl迭代器{
iter.map(|x | x*x)
}
但是,要在
迭代器上定义该方法,我必须首先定义一个
trait
。 这就是我奋斗的地方 — traits不能在返回值中使用
impl
关键字

我正在寻找以下类似的东西,但不起作用:

trait可计算{
fn平方(自)->I;
}
J的impl可计算
哪里
I:迭代器,
J:迭代器,
{
fn平方(自)->I{
self.map(|x | x*x)
}
}

我曾多次尝试解决该问题,但都失败了,包括将
squared
的返回类型更改为
Map u8>
,并修补
不合适的
s,但到目前为止没有任何效果。任何帮助都将不胜感激

首先,您的输出迭代器应该是一个关联类型,而不是trait参数,因为该类型是trait的输出(调用者无法控制)

使用显式
映射
类型
::map(f)
有一个类型
std::iter::map
,因此如果映射函数的类型
f
已知,我们可以显式使用该类型,而无需运行时开销。但是,这确实将特定类型作为函数返回类型的一部分公开,这使得将来在不破坏依赖代码的情况下很难替换它。在大多数情况下,功能也不为人所知;在这种情况下,我们可以使用
F=fn(u8)->u8
,但是因为函数不保持任何内部状态(但通常不起作用)

trait可计算:大小{
fn平方(自)->std::iter::Map u8>;
}
对我来说,这是不可原谅的{
fn平方(自)->std::iter::Map u8>{
self.map(|x | x*x)
}
}
使用关联类型 上述的一个替代方法是给该性状赋予一个关联类型。这仍然有一个限制,即函数类型必须是已知的,但它更一般一些,因为
Map
类型绑定到实现,而不是trait本身

trait可计算{
类型输出:迭代器;
fn平方(self)->self::输出;
}
对我来说,这是不可原谅的{
类型输出=std::iter::Map u8>;
fn平方(自)->自::输出{
self.map(|x | x*x)
}
}
在关联类型中使用
impl
这类似于上面的“使用关联类型”,但您可以完全隐藏实际类型,除了它是迭代器这一事实之外。我个人认为这是首选的解决方案,但不幸的是,它仍然不稳定(取决于
type\u alias\u impl\u trait
特性),因此只能在夜间使用

#![特征(类型\u别名\u实施特征)]
性状可数{
类型输出:迭代器;
fn平方(self)->self::输出;
}
对我来说,这是不可原谅的{
类型输出=impl迭代器;
fn平方(自)->自::输出{
self.map(|x | x*x)
}
}
trait Squarable {
    type Output: Iterator<Item = u8>;
    fn squared(self) -> I;
}