小编And*_*son的帖子

如何像 itertools 那样使用collect_vec() 来扩展特征?

我想创建一个类似于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_vecMyItertools.

一种可能的解决方案是针对impl MyItertools所有类型的 Iterator …

generics iterator traits scoping rust

2
推荐指数
1
解决办法
471
查看次数

标签 统计

generics ×1

iterator ×1

rust ×1

scoping ×1

traits ×1