我想要一个结构:
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缺乏经验,但是并没有取得太大的进步。