rust - 我应该如何减少 rust 类型签名的重复?
问题描述
我有以下不是很干的工作代码:
impl<'a, G, E, N, EW, NW, ER, NOW, EOW> Overlay<'a, G, E, N, EW, NW, ER, NOW, EOW>
where
&'a G: GraphBase<EdgeId = E, NodeId = N> +
Data<EdgeWeight = EW, NodeWeight = NW> +
DataMap,
ER: EdgeRef<Weight = EW, EdgeId = E, NodeId = N>,
E: Copy + Eq + Hash,
N: Copy + Eq + Hash,
{
fn overlayed_elements(&'a self) -> OverlayedItems<'a, G, E, N, EW, NW, ER, NOW, EOW>{
OverlayedItems{
overlay: self,
phase: Phase::Nodes(self.nodes.iter()),
node_indexes: HashMap::new(),
}
}
pub fn overlay_edge<'b>(&'b mut self, edge: ER, eow: EOW) {
self.edges.insert(edge.id(), eow);
self.edge_refs.insert(edge.id(), edge);
}
pub fn overlay_node<'b>(&'b mut self, node: N, now: NOW) {
self.nodes.insert(node, now);
}
fn remove_edge<'b>(&'b mut self, edge: E) {
self.edges.remove(&edge);
self.edge_refs.remove(&edge);
}
fn remove_node<'b>(&'b mut self, node: N) {
self.nodes.remove(&node);
}
}
我有很多重复,<'a, G, E, N, EW, NW, ER, NOW, EOW>
而且通常似乎所有这些特质的东西都占用了很多空间。这只是糟糕的代码,还是我做错了什么?
解决方案
关联类型并不总是需要有自己的类型参数。例如,您可以G::EdgeId
在 bound 中写入,而不是使用单独的 parameter E
。
我调整了操场链接中的代码以减少类型参数的数量。这是更新的链接。例如,Overlay
现在有 4 个而不是 8 个类型参数:
pub struct Overlay<G, ER, NOW, EOW>
where
G: GraphBase + Data,
ER: EdgeRef<Weight = G::EdgeWeight, EdgeId = G::EdgeId, NodeId = G::NodeId>,
{
nodes: HashMap<G::NodeId, NOW>,
edges: HashMap<G::EdgeId, EOW>,
edge_refs: HashMap<G::EdgeId, ER>,
graph: G,
}
请注意,我删除了and的(不必要的)Copy + Eq + Hash
特征界限。此外,不再在 trait bound 中的引用后面,这可能会导致生命周期问题,但如果需要,可以修复这些问题。G::NodeId
G::EdgeId
G
推荐阅读
- android - 如何在 Kotlin 中进行动态背景颜色更改?
- background-process - SQL Server tempdb 阻塞事务名称="CQSIndexDesc::FGetData"
- nginx - nginx 后端返回 404,使用拦截指令时返回 403
- php - 在检查元素上删除/绕过验证码
- javascript - 如何正确使用 async.map()?
- mysql - 我想从表 ST 中获取最新条目,但无法找到正确的查询来获得预期的输出
- mysql - MariaDB 服务处于活动状态但出现错误,不适用于起搏器
- gtk - 当 Gtk.ComboBox 中的活动项更改时更新 Gtk.Label
- reactjs - 在 React 中保存元素的状态
- python - Pycharm apache spark mongodb connect : java.lang.NoClassDefFoundError: scala/Product$class