此代码:
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
。
答案 0 :(得分:7)
代码中没有关联的类型参数。 Associated types仅适用于特征,允许您写下:
trait Graph {
type Node;
type Edge;
}
特别是,结构中有普通的类型参数(N
和E
)。如果没有共同特征,则必须手动解析类型。无论如何,这里做起来并不复杂。
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;