トレイトを実装する

// 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 ブロックは複数のモジュールやファイルにまたがっていてもかまいません。