構造体、列挙型、トレイト

Rust Traits

Describe shared behavior once and implement it for any type, like interfaces in other languages.

  • 中級
  • 約4分で読めます
  • 実行できるサンプル 1 件
学べること
  • Defining a trait
  • Default methods
  • impl Trait and dyn Trait
trait Describe
  • Describe
    • Dogkeeps the default
    • Robotreplaces describe

Shared behavior for different types

A trait is a set of methods that a type can implement, similar to an interface in other languages. Code written against the trait works with every type that implements it.

Describe requires name and gives describe a default body. Dog keeps the default, while Robot replaces it. introduce accepts any type that implements Describe, and Box<dyn Describe> lets one vector hold values of different types.

重要なポイント

  1. A trait lists methods a type must have.
  2. A default method can be kept or replaced.
  3. Box<dyn Trait> stores different types together.

実行できる Rust のサンプル

Rust
コードを実行 →
main.rs
trait Describe {
    fn name(&self) -> String;

    fn describe(&self) -> String {
        format!("This is {}.", self.name())
    }
}

struct Dog;
struct Robot {
    model: u32,
}

impl Describe for Dog {
    fn name(&self) -> String {
        String::from("a dog")
    }
}

impl Describe for Robot {
    fn name(&self) -> String {
        format!("robot model {}", self.model)
    }

    fn describe(&self) -> String {
        format!("Beep. I am {}.", self.name())
    }
}

fn introduce(item: &impl Describe) {
    println!("{}", item.describe());
}

fn main() {
    introduce(&Dog);
    introduce(&Robot { model: 7 });

    let items: Vec<Box<dyn Describe>> = vec![Box::new(Dog), Box::new(Robot { model: 8 })];
    println!("{} items", items.len());
}
この例の実行ボタンを作成 実行結果
This is a dog.
Beep. I am robot model 7.
2 items

練習

サンプルをオンラインコンパイラーで開き、値を変えたり行を追加したりして、実行する前に出力を予想してみましょう。次に、わざとコードを壊してコンパイラーのメッセージを読んでみてください。

このレッスンを終えましたか?

学習済みにすると進み具合を記録できます。

次へ: Generics →

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ