从struct获取关联类型的任何方法?

时间:2017-07-26 13:53:57

标签: rust

此代码:

use std::collections::HashMap;

struct MyNode;
struct MyEdge;

struct Graph<N, E> {
    h: HashMap<N, Vec<E>>,
}

type MyGraph = Graph<MyNode, MyEdge>;

fn main() {

    let x: MyGraph::N;//XXX

    println!("Results:")

}

无法使用错误进行编译:

error[E0223]: ambiguous associated type
  --> /home/xxx/.emacs.d/rust-playground/at-2017-07-26-164119/snippet.rs:21:12
   |
21 |     let x: MyGraph::N;
   |            ^^^^^^^^^^ ambiguous associated type
   |
   = note: specify the type using the syntax `<Graph<MyNode, MyEdge> as Trait>::N`

有没有办法从N获取Graph<MyNode, MyEdge>类型?

我创建了一个别名(type =),不重复节点类型定义, 所以标记为XXX时我会写得不错let x: MyNode而不是let x: expression with MyGraph as argument

1 个答案:

答案 0 :(得分:7)

代码中没有关联的类型参数。 Associated types仅适用于特征,允许您写下:

trait Graph {
    type Node;
    type Edge;
}

特别是,结构中有普通的类型参数(NE)。如果没有共同特征,则必须手动解析类型。无论如何,这里做起来并不复杂。

struct GraphImpl<N, E> {
    h: HashMap<N, Vec<E>>,
}

type MyGraph = GraphImpl<MyNode, MyEdge>;

let x: MyNode;

但是,如果你为你的结构实现这个Graph特征:

impl<N, E> Graph for GraphImpl<N, E> {
    type Node = N;
    type Edge = E;
}

然后您可以检索相关类型,如this question

所示
let x: <MyGraph as Graph>::Node;

Playground