はあなたが尋ねたものです:特性上のすべての境界が「見出し」である必要はあり
trait TextBoard: Board
where
Self::Move: Debug,
{
// ...
}
。あなたが形質の本体を書くことを始めたら、あなたは追加の制限を課すことはできません。 <Foo as Board>::Move
にDebug
(playground)が実装されていない場合、この境界はimpl TextBoard for Foo
の書き込みを防ぎます。
多分それはあなたが何をしたいですが、あなたが本当にに必要なのですが、他のタイプのためのTextBoard
を実装を防ぎますか?いくつかのタイプの場合、print_moves
を書く方がいいかもしれません。Debug
の要件はちょうどノイズです。あなたはおそらくwhere
節をスキップして毛布impl
にprint_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
などの標準的なライブラリー形質の多くは、このような境界で定義されたオプションのメソッドを持っています。欠点は、Move
Debug
でなければならないという要件の他に、Board
の意味を実際には考慮していないかもしれないBoard
特性を印刷コードでクラッタするということです。
'&Board' 'T:fmt :: Debug'が問題を解決するフリースタンディング関数' printMoves'を作成するのでしょうか、あるいはリファインメント特性を曲げていますか? –