generics - 你如何像 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);
}
我相当天真地期望编译器会在范围内使用我collect_vec
的原样
。MyItertools
必须有一些其他itertools
的魔法才能让它编译。
我们得到错误:
error[E0599]: no method named `collect_vec` found for struct `std::ops::Range<{integer}>` in the current scope
--> src/main.rs:14:20
|
14 | let v = (0..5).collect_vec();
| ^^^^^^^^^^^ method not found in `std::ops::Range<{integer}>`
|
= help: items from traits can only be used if the trait is implemented and in scope
note: `MyItertools` defines an item `collect_vec`, perhaps you need to implement it
--> src/main.rs:5:1
|
5 | pub trait MyItertools: Iterator {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
这是误导性的,因为我们确实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);
}
推荐阅读
- android - 由于用户角色而使按钮消失(kotlin)
- c++ - 使用“无符号短”数据类型会中断循环
- apache-kafka - 如何聚合 kafka 主题?
- r - 数据表中的累积向量
- macos - Mac终端无法访问文件
- php - 如何在 wp insert post 中插入多个类别 ID?
- r - 为什么在将“lm”模型传递给 effectsize::effectsize() 时会收到关于 stats::model.frame() 的错误?
- javascript - MomentJS 格式来自 MongoDB 的相对日期
- linux-kernel - 识别 Pthread 堆栈区域的正确方法
- angular - Angular Forms,ng-valid 始终存在