2016-09-07 8 views
0

もっと汎用的なものを手に入れようとしましたが、関連する型で試してみることに失敗しました。特定の種類の形状に対してBuilderを返そうとすると、Shapeの形質とRendererの型が与えられます。私が達成したい何ジェネリック型を関連する型で返す

形状

#[derive(Clone, Copy)] 
pub struct Rectangle{ 
    pub origin: Point, 
    pub height: usize, 
    pub width: usize, 
} 

pub trait Shape{ 
    type Builder : ShapeBuilder; 
} 

impl Shape for Rectangle{ 
    type Builder = RectangleBuilder; 
} 

ビルダー

pub trait ShapeBuilder{ 
    type Renderer: ShapeRenderer; 
    fn set_origin() -> Self::Renderer; 
} 

pub struct RectangleBuilder; 

impl ShapeBuilder for RectangleBuilder{ 
    type Renderer = RectangleRenderer; 
    fn set_origin() -> Self::Renderer{ 
     RectangleRenderer 
    } 
} 

レンダラ

pub struct Renderer<'a>{ 
    canvas:&'a mut Canvas 
} 

impl <'a>Renderer<'a>{ 
    pub fn new(canvas:&'a mut Canvas) -> Renderer { 
     Renderer{ 
      canvas: canvas 
     } 
    } 
    pub fn set_shape<T: Shape>(&self, shape: T) -> T::Builder{ 
     // trying to return the specific builder through shape::Builder 
     // or something like that 
    } 
} 

はtですshape与え場合set_shape方法はRectangleBuilderを返します帽子はあなたが新しいSelfをインスタンス化ShapeBuilderトレイトの静的メソッドを提供する必要があるタイプRectangle

+0

ビルダーは新しいインスタンスを初期化するためのパラメータが必要です、または彼らはパラメータなしで構築可能であるために仮定されていますか? –

+0

実際にはい - ビットスタブの実装のいくつかの種類です - 最初にレンダラーから戻るビルダーへの移行を達成したい。あなたはすでにビルダーパターンを作成しようとしていることに気付いているかもしれません。 – xetra11

+0

私は最初のコメントを正しく訳していないと思います。ビルダーを構築するには、パラメータが必要ですか、または 'ShapeBuilder'の各実装がパラメータなしで構築をサポートする必要がありますか? –

答えて

2

です。静的メソッドは、selfパラメータを持たない単なるメソッドです。

pub trait ShapeBuilder: Sized { 
    type Renderer: ShapeRenderer; 

    fn new() -> Self; 
    fn set_origin() -> Self::Renderer; 
} 

するか、賢いこととDefaultのsubtraitとしてShareBuilderを定義します。

あなたは、直接メソッドを追加することができます。

pub trait ShapeBuilder: Default { 
    type Renderer: ShapeRenderer; 

    fn set_origin() -> Self::Renderer; 
} 

その後、set_shapeに、あなたはShapeBuilderをインスタンス化することができます

impl <'a>Renderer<'a>{ 
    pub fn set_shape<T: Shape>(&self, shape: T) -> T::Builder { 
     ShapeBuilder::new() // or Default::default() 
    } 
} 
+0

この例では、 'Rectangle'オブジェクトを' shape'引数として設定すると 'ShapeBuilder :: new()'はRectangleBuilderを返しますか?なぜなら、 'Self :: ShapeBuilder'(これは私が知っている間違った構文です)のようなものではなく、' Self'を返すだけなので、戻ってくるBuilderが 'RectangleBuilder'であるかどうかは分かりませんから。 – xetra11

+0

@ xetra11はい。形質の定義における「自己」とは、「この形質を実現する具体的な型」を意味する。この場合、 'RectangleBuilder'です。 'ShapeBuilder :: new()'の代わりに 'T :: Builder :: new()'や ' :: new()'を書くこともできます。 – krdln

+0

ああ大丈夫です... ShapeBuilder :: new()を呼び出すと、関連するT型のタイプについて話していることを暗黙のうちに知っています - かなり魔法と非常に読みにくいとは思いませんか? ? – xetra11

関連する問題