gpt4 book ai didi

rust - 我应该如何减少 Rust 类型签名的重复?

转载 作者:行者123 更新时间:2023-12-03 11:24:48 24 4
gpt4 key购买 nike

我有以下不是很干的工作代码:

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);
}
}

context

playground

我有很多重复的 <'a, G, E, N, EW, NW, ER, NOW, EOW>并且通常似乎所有这些特征thingamamagigs都占用了大量空间。这只是糟糕的代码,还是我做错了什么?

最佳答案

关联类型并不总是需要有自己的类型参数。例如,您可以写 G::EdgeId在一个范围内而不是有一个单独的参数 E .

我调整了操场链接中的代码以减少类型参数的数量。这是updated link .例如,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,
}

请注意,我删除了(不必要的) Copy + Eq + Hash G::NodeId 的特征边界和 G::EdgeId .另外, G不再落后于特征边界中的引用,这可能会导致生命周期问题,但如有必要,可以修复这些问题。

关于rust - 我应该如何减少 Rust 类型签名的重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60792494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com