在迭代器上创建以Rust格式返回迭代器的方法
我想定义一个lazy在迭代器上创建以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不能在返回值
square()
方法,它没有不必要的运行时开销(nodyn
关键字),可以在任何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;
}