2017-10-30 7 views
2

私は、境界のない関連タイプを持つ単純な形質を持っています。supertraitよりも厳密な関連するタイプ境界を持つ形質

trait Board { 
    type Move; 
    fn moves(&self) -> Vec<Self::Move>; 
} 

私もsupertraitとしてこの特性を利用したいです。特に、私は新しいサブトラクションが関連するタイプに対してより厳密な境界を持つようにしたい。このような何か:

trait TextBoard: Board { 
    type Move: fmt::Debug; // Trying to tighten bounds on associated type 
    fn printMoves(&self) { 
     println!("{:?}", self.moves()); 
    } 
} 

例は非常に単純化しているが、問題を示しているようだ:コンパイラは、私は新しい関連したタイプを作成しようとしていると考えて、私はちょうどタイトな境界を必要とするsubtraitをしたいです。これを達成する方法はありますか?ここで

+1

'&Board ' 'T:fmt :: Debug'が問題を解決するフリースタンディング関数' printMoves'を作成するのでしょうか、あるいはリファインメント特性を曲げていますか? –

答えて

8

はあなたが尋ねたものです:特性上のすべての境界が「見出し」である必要はあり

trait TextBoard: Board 
where 
    Self::Move: Debug, 
{ 
    // ... 
} 

。あなたが形質の本体を書くことを始めたら、あなたは追加の制限を課すことはできません。 <Foo as Board>::MoveDebugplayground)が実装されていない場合、この境界はimpl TextBoard for Fooの書き込みを防ぎます。


多分それはあなたが何をしたいですが、あなたが本当にに必要なのですが、他のタイプのためのTextBoardを実装を防ぎますか?いくつかのタイプの場合、print_movesを書く方がいいかもしれません。Debugの要件はちょうどノイズです。あなたはおそらくwhere節をスキップして毛布implprint_movesの体を移動するような場合には:このバージョンでは

trait TextBoard { 
    fn print_moves(&self); 
} 

impl<B: Board> TextBoard for B 
where 
    B::Move: Debug, // or <Self as Board>::Move: Debug 
{ 
    fn print_moves(&self) { 
     println!("{:?}", self.moves()); 
    } 
} 

、あなたはまだ、Self::Move: Debugのタイプのimplを記述する必要はありませんしかし、あなたはではありませんは、それが保持されていない他のタイプのために書いてからではありません。それはのの詳細よりも、のものです。一方


、あなたはかなりいつもその形質を持っていることは本当に便利です、あらゆるタイプのDebugを実装する必要がありますか?たぶん、何をしたいことは実現していますBoard上だけで任意の方法があるときMove: Debug

trait Board { 
    type Move; 

    fn moves(&self) -> Vec<Self::Move>; 

    fn print_moves(&self) 
    where 
     Self::Move: Debug, 
    { 
     println!("{:?}", self.moves()); 
    } 
} 

これは、元のバージョンのようなものですが、新しいTextBoard形質の添加を必要としないので、それはおそらくに削減されますあなたが書かなければならない明示的な境界の数。 Iteratorなどの標準的なライブラリー形質の多くは、このような境界で定義されたオプションのメソッドを持っています。欠点は、MoveDebugでなければならないという要件の他に、Boardの意味を実際には考慮していないかもしれないBoard特性を印刷コードでクラッタするということです。

関連する問題