トレイトを実装する
// Copyright 2024 Google LLC // SPDX-License-Identifier: Apache-2.0 trait Pet { fn talk(&self) -> String; fn greet(&self) { println!("Oh you're a cutie! What's your name? {}", self.talk()); } } struct Dog { name: String, age: i8, } impl Pet for Dog { fn talk(&self) -> String { format!("Woof, my name is {}!", self.name) } } fn main() { let fido = Dog { name: String::from("Fido"), age: 5 }; dbg!(fido.talk()); fido.greet(); }
-
Typeに対してTraitを実装するには、impl Trait for Type { .. }ブロックを使います。 -
Go のインターフェースとは異なり、対応するメソッドがあるだけでは十分ではありません。
talk()メソッドを持つCat型があっても、impl Petブロックに入っていない限り、自動的にPetを満たすことにはなりません。 -
トレイトは一部のメソッドにデフォルト実装を提供できます。デフォルト 実装は、そのトレイトのすべてのメソッドを利用できます。この場合、
greetが提供されており、talkに依存しています。 -
1 つの型に対して複数の
implブロックを持つことができます。これには、 固有のimplブロックとトレイトimplブロックの両方が含まれます。 同様に、1 つの型に対して複数のトレイトを実装することもできます (実際、多くの型はたくさんのトレイトを実装しています)。implブロックは複数のモジュールやファイルにまたがっていてもかまいません。