Trait
Traitを使用することで、ある型の振る舞いを定義できます。
具体的には以下のように、Traitはfn
の集合になっています。
pub trait MyProtocol {
fn my_func_a(&mut self);
fn my_func_b(&mut self);
}
実装詳細はここでは定義しません。あくまでも振る舞いだけを定義します。これはSwiftなどのprotocol
志向プログラミングによく似ているように思います。
構造体に実装する
構造体にfor
キーワードで組み込むことができます。
ここで具体的な実装を定義できます。
impl MyProtocol for Struct {
fn my_func(&mut self) {
// 実装詳細をここで記述できる
}
}
まだ実装詳細がない場合はunimplemented!();
メソッドが使用できます。
impl MyProtocol for Struct {
fn my_func(&mut self) {
unimplemented!();
}
}
プロトコル志向だとしたら
実装詳細を含まないTrait(特性)
だけを先に定義し、それを使って実装することでコンパイラに何をしようとしているかを伝え、ある意味で未来の実装方針を『約束(まさしくProtocol)』します。
つまり、本質的にはコンパイラは二度にわたって指示されます。1度目はこの約束事としてのTrait宣言。
もう一つは、約束の「履行」として実装詳細を指示します。コンパイラが約束通りに特性が実装されているかをチェックしてくれるので、安心してコーディングできます。