这里有一个(有点做作的)例子来说明我想做什么

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

有没有办法在Graph个特征中表示Graph::Node必须与Graph::Edge::Node相同,Graph::Edge必须与Graph::Node::Edge相同?

我记得读过一篇关于一个特性(当时还没有实现)的文章,该特性允许对这类事情进行更丰富的约束,但我不记得它的名字,也找不到它.

推荐答案

Graph的定义中,可以约束每个关联类型的关联类型(!)等于Graph中对应的关联类型.

pub trait Graph {
    type Node: Node<Edge = Self::Edge>;
    type Edge: Edge<Node = Self::Node>;
    fn get_nodes(&self) -> Vec<Self::Node>;
}

Rust相关问答推荐

为什么单元类型(空元组)实现了`Extend`trait?

收集RangeInclusive T到Vec T<><>

为什么要在WASM库中查看Rust函数需要`#[no_mangle]`?

为什么复印是豆荚的一个重要特征?

通过解引用将值移出Box(以及它被脱糖到什么地方)?

为什么reqwest以文本形式下载二进制文件?

如何循环遍历0..V.len()-1何时v可能为空?

如何为 struct 字段设置新值并在Ruust中的可变方法中返回旧值

为什么铁 rust S的默认排序功能比我对小数组的 Select 排序稍微慢一些?

使用关联类型重写时特征的实现冲突

Rust ndarray:如何从索引中 Select 数组的行

Rust 中什么时候可以返回函数生成的字符串切片&str?

如何执行数组文字的编译时串联?

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

将引用移动到线程中

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

为什么这个闭包没有实现Fn?

判断对象是 PyDatetime 还是 Pydate 的实例?

在空表达式语句中移动的值

Rust 跨同一文件夹中文件的可见性