yni*_*ous 8 rust associated-types
这是一个(有点人为的)例子来说明我想做什么
pub trait Node: Eq + Hash {
type Edge: Edge;
fn get_in_edges(&self) -> Vec<&Self::Edge>;
fn get_out_edges(&self) -> Vec<&Self::Edge>;
}
pub trait Edge {
type Node: Node;
fn get_src(&self) -> &Self::Node;
fn get_dst(&self) -> &Self::Node;
}
pub trait Graph {
type Node: Node;
type Edge: Edge;
fn get_nodes(&self) -> Vec<Self::Node>;
}
pub fn dfs<G: Graph>(root: &G::Node) {
let mut stack = VecDeque::new();
let mut visited = HashSet::new();
stack.push_front(root);
while let Some(n) = stack.pop_front() {
if visited.contains(n) {
continue
}
visited.insert(n);
for e in n.get_out_edges() {
stack.push_front(e.get_dst());
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在Graph特征中表达Graph::Node必须是同一类型,Graph::Edge::Node并且Graph::Edge必须是同一类型Graph::Node::Edge?
我记得读过一些关于某个功能(当时没有实现)的内容,它可以为这类内容提供更丰富的约束,但我不记得它的名字,也找不到它.
Fra*_*gné 11
在Graph定义中,您可以将每个关联类型的关联类型(!)限制为等于相应的关联类型Graph.
pub trait Graph {
type Node: Node<Edge = Self::Edge>;
type Edge: Edge<Node = Self::Node>;
fn get_nodes(&self) -> Vec<Self::Node>;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2435 次 |
| 最近记录: |