2017-07-26 12 views
1

このコード:構造体から関連する型を取得する方法はありますか?

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` 

Graph<MyNode, MyEdge>からNタイプを取得する方法はありますか?

私はそれが私がいないlet x: MyNodeなく、let x: expression with MyGraph as argumentを書くことができXXXをマーク時点で、素晴らしいことだ 、ノードタイプの定義を複製しないようにエイリアス(type =)を作成しました。

+1

Th不必要に複雑に思われる。どうして 'let x:MyNode;'だけではないのですか?複数のノードタイプがありますか? – ljedrz

+0

@ ljedrzええと、私のプログラムに 'let x:MyNode'がたくさんあるようなコードの重複を防ぐため、このグラフの' Node'型を変更すると、それらの場所をすべて修正する必要があります。 – user1244932

答えて

7

コードに関連する型パラメータはありません。 Associated typesは、あなたがこれを書くことができます唯一の特性にも適用可能である:

特に
trait Graph { 
    type Node; 
    type Edge; 
} 

、あなたは構造体(NE)の通常の型パラメータを持っています。共通の特性がなければ、タイプを手動で解決する必要があります。とにかくここでやることは複雑なことではありません。 this questionに示すよう

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

はあなたが関連付けられている型を取得することができます:あなたは場合

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

type MyGraph = GraphImpl<MyNode, MyEdge>; 

let x: MyNode; 

しかし、あなたの構造体のために、このGraph形質を実装

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

Playground

関連する問題