我正在尝试在Rust中实现通用的弹性分布式数据集(RDD)。我有一个RDD
特征:
pub trait RDD<I, O>: Serialize {
fn compute<II, OI>(&self, iter: II, partition: &Partition, context: &TaskContext) -> OI
where
OI: Iterator<Item = O>,
II: Iterator<Item = I>;
}
然后是MapRDD
结构及其RDD
特征的实现:
#[derive(Serialize, Deserialize)]
pub struct MapRDD<F, I, O>
where
F: RDDFunc<(I), O>,
{
closure: F,
marker: PhantomData<(I, O)>,
}
impl<F, I, O> RDD<I, O> for MapRDD<F, I, O>
where
F: RDDFunc<(I), O>,
{
fn compute<II, OI>(&self, iter: II, partition: &Partition, context: &TaskContext) -> OI
where
OI: Iterator<Item = O>,
II: Iterator<Item = I>,
{
return iter.map::<O, FnMut(I) -> O>(|x: I| -> O { self.closure.call((x)) });
}
}
可能有一些重复数据删除类型提示。代码没有编译:
error: the `map` method cannot be invoked on a trait object
--> src/rdd/transformations/map.rs:16:25
|
16 | return iter.map::<O, FnMut(I) -> O>(|x: I| -> O {
|
因为会有任意组合的计算结果,Iterator<O>
或OI
被链接以构成工作流程,所以我必须在这里使用通用。
出现此错误的原因是什么?一个特征对象,这里的iter
是否可被其底层结构函数使用?