如何将通用值存储在非通用结构内的HashMap中

时间:2019-03-20 08:25:47

标签: rust

我想要一个结构:

struct AllCaches {
    vectors: HashMap<usize, Cache<T>>,
}

AllCaches的目的是保存与键入的{Cache)有关的<T>的各种有用信息。

很显然,这不是有效的代码,因为我需要在我的<T>声明中指定AllCaches。我不能这样做,因为AllCaches结构旨在保留我的所有缓存,而不论其<T>为何。

我当前的解决方案涉及一个特质,我将其实现为:

struct AllCaches {
    vectors: HashMap<usize, Box<dyn CacheTrait>>,
}

我设法完成了这项工作,但是它涉及很多令人讨厌的/混乱的向下转换和可怕的代码,例如:

let data;
if let Some(thing) = caches.downcast_ref::<Cache<u64>>() {
    debug!("U64");
    data = VectorType::U64(thing.populate_vector(&req.index, &mvector));
} else if let Some(thing) = caches.downcast_ref::<Cache<f64>>() {
    debug!("F64");
    data = VectorType::F64(thing.populate_vector(&req.index, &mvector));
}

(使用downcast-rs板条箱实现向下投射)。

对我的代码的影响是,我需要很多非常重复的(<T>)特定功能,而使用通用类型的好处似乎就消失了。

这对我来说似乎很可怕,我觉得必须有一个更好的答案。

我已经花了一个星期的时间(反复地)进行了研究,并研究了其他选择,例如使用枚举,但这似乎并没有改善这种情况(尽管,也许我并不完全理解这种方法)。我已经完成了很多查阅和阅读文档的工作,我对Rust缺乏经验,但是并没有取得太大的进步。

0 个答案:

没有答案