Я изучаю источник для библиотеки petgraph и не могу определить, откуда взялся тип Graph::NodeId
.
Я вижу, что функция astar
принимает тип G
(это может быть Graph
). astar
ожидает, что в пространстве имен G
будет тип NodeId
.
pub fn astar<G, F, H, K, IsGoal>(
graph: G,
start: G::NodeId,
is_goal: IsGoal,
edge_cost: F,
estimate_cost: H
) -> Option<(K, Vec<G::NodeId>)> where
G: IntoEdges + Visitable,
IsGoal: FnMut(G::NodeId) -> bool,
G::NodeId: Eq + Hash,
F: FnMut(G::EdgeRef) -> K,
H: FnMut(G::NodeId) -> K,
K: Measure + Copy,
Я вижу, что Graph
определяется как
pub struct Graph<N, E, Ty = Directed, Ix = DefaultIx> {
nodes: Vec<Node<N, Ix>>,
edges: Vec<Edge<E, Ix>>,
ty: PhantomData<Ty>,
}
Однако я не вижу, откуда взялся тип NodeId
. Единственное место, которое я вижу в исходном коде, это реализация черты EdgeRef for EdgeReference
impl<'a, Ix, E> EdgeRef for EdgeReference<'a, E, Ix>
where Ix: IndexType,
{
type NodeId = NodeIndex<Ix>;
type EdgeId = EdgeIndex<Ix>;
type Weight = E;
fn source(&self) -> Self::NodeId { self.node[0] }
fn target(&self) -> Self::NodeId { self.node[1] }
fn weight(&self) -> &E { self.weight }
fn id(&self) -> Self::EdgeId { self.index }
}
Но я не понимаю, как этот тип попадет в область действия под Graph
.