Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 我应该如何减少锈迹类型签名的重复?_Rust - Fatal编程技术网

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

Rust 我应该如何减少锈迹类型签名的重复?,rust,Rust,我的工作代码不是很枯燥: impl 哪里 &“a:G:GraphBase+ 资料+ 数据地图, 呃:埃杰里夫,, E:Copy+Eq+Hash, N:Copy+Eq+Hash, { fn叠加元素(&'a self)->叠加元素(&'b mut self,edge:ER,eow:eow){ self.edges.insert(edge.id(),eow); self.edge\u refs.insert(edge.id(),edge); } pub fn overlay_node关联的类型并不总是

我的工作代码不是很枯燥:

impl
哪里
&“a:G:GraphBase+
资料+
数据地图,
呃:埃杰里夫,,
E:Copy+Eq+Hash,
N:Copy+Eq+Hash,
{
fn叠加元素(&'a self)->叠加元素(&'b mut self,edge:ER,eow:eow){
self.edges.insert(edge.id(),eow);
self.edge\u refs.insert(edge.id(),edge);
}

pub fn overlay_node关联的类型并不总是需要有自己的类型参数。例如,您可以在绑定中写入
G::EdgeId
,而不需要单独的参数
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,
}
pub结构覆盖
哪里
G:GraphBase+数据,
呃:埃杰里夫,,
{
节点:HashMap,
边缘:HashMap,
边缘参考:HashMap,
图:G,
}

请注意,我删除了
G::NodeId
G::EdgeId
的(不必要的)
Copy+Eq+Hash
trait边界。此外,
G
不再位于trait边界中的引用后面,这可能会导致生存期问题,但这些问题可以在必要时修复。

相关类型(例如,
GraphBase
trait中的
EdgeId
NodeId
)不总是需要指定。看看是否可以从impl中删除
E
N
EW
NW
。我还没有测试过这一点,但你应该能够通过编写
G::EdgeId
等来使用这些类型。一个用于实验的链接会很棒!我刚刚添加了一个操场链接,我不得不做一些修改,以便t我有一个对图形的引用,而不是覆盖中图形的副本,但这要好得多。我甚至还可以去掉ER参数!@timthelion实际上,如果您使用类似于
覆盖
,您仍然可以在我的解决方案中存储对图形的引用,因为
&graph
实现了
GraphBase
tr美国在台协会。