And*_*son 2 generics iterator traits scoping rust
我想创建一个类似于collect_vec()中的函数的方法itertools。
通过复制itertools代码创建一个小示例:
pub trait MyItertools: Iterator {
fn collect_vec(self) -> Vec<Self::Item>
where Self: Sized
{
self.collect()
}
}
fn main() {
let v = (0..5).collect_vec();
println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)
我天真地期望编译器将在范围内collect_vec按原样
使用我的MyItertools。
必须有一些其他的魔法itertools在起作用才能让它编译。
我们得到错误:
pub trait MyItertools: Iterator {
fn collect_vec(self) -> Vec<Self::Item>
where Self: Sized
{
self.collect()
}
}
fn main() {
let v = (0..5).collect_vec();
println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)
这是误导性的,因为我们确实collect_vec在MyItertools.
一种可能的解决方案是针对impl MyItertools所有类型的
Iterator,但似乎没有一种方法可以针对所有Iterator实现特征和类型执行此操作。
这个难题中缺少的神奇部分是一个通用的毯子实现,它MyItertools为所有实现该特征的类型实现该Iterator特征。更新的固定示例:
pub trait MyItertools: Iterator {
fn collect_vec(self) -> Vec<Self::Item>
where Self: Sized
{
self.collect()
}
}
impl<T> MyItertools for T where T: Iterator {}
fn main() {
let v = (0..5).collect_vec();
println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)