我有一个带有两个变体的枚举.其中一个变体包含VEC,另一个包含BTreeMap.我希望能够迭代这两个容器.实际上,我喜欢给VEC"消息",这样它的行为就像BTreeMap一样,其值固定为1.设置如下:
pub struct Sketch {
pub name: String,
pub hashes: Vec<u64>,
}
pub struct WeightedSketch {
pub name: String,
pub hashes: BTreeMap<u64, u32>,
}
pub enum SketchType {
Unweighted(Sketch),
Weighted(WeightedSketch),
}
impl SketchType {
pub fn hashes(&self) -> Iter<u64, u32> {
match self {
SketchType::Weighted(sketch) => sketch.hashes.iter(),
SketchType::Unweighted(sketch) => sketch.hashes.iter().map(|hash| (*hash, 1 as u32)).collect::<BTreeMap<u64, u32>>().iter(),
}
}
}
这没有编译,但更关键的是,似乎不是正确的总体方法.作为一个简单的例子,不管SketchType的变体是什么,我都希望能够执行以下操作:
fn do_work(sketch: &SketchType) -> u64 {
sketch.values().map(|v| *v as u64).sum()
}
枚举是这里的正确方法吗?我需要以某种方式实现SketchType的Iterator特征吗?
谢谢, 多诺万