メインコンテンツにスキップ
モジュール 5 · レッスン 2 / 2コース内の 10/14~15 min
モジュールのレッスン (2/2)

特性と特性境界

特性は、特定のタイプが有し、他のタイプと共有できる動作を定義します。トレイトを使用すると、他のプログラミング言語のインターフェイスと同様に、特定の共通機能またはインターフェイスを表す一連のメソッドを定義できます。

特性境界 を使用すると、ジェネリック型が特定の特性を実装する必要があることを指定でき、必要なメソッドがコンパイル時に使用できるようになります。


特性の定義と実装

特性を定義するには、trait キーワードの後に​​、実装型が定義する必要があるメソッドのシグネチャを使用します。

Rust
pub trait Summary {
    fn summarize(&self) -> String;
}

具体的な型に特性を実装するには、構文 impl TraitName for TypeName を使用します。

Rust
pub struct NewsArticle {
    pub headline: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}", self.headline)
    }
}

特性の境界

ジェネリック関数を作成する場合、型パラメーターを制約して、特定の特性を確実に実装することができます。標準の構文は <T: Trait> です。

Rust
pub fn notify<T: Summary>(item: &T) {
    println!("Notification: {}", item.summarize());
}

あるいは、より複雑な署名の場合は、where 句を使用できます。

Rust
pub fn notify_advanced<T>(item: &T)
where
    T: Summary
{
    println!("Notification: {}", item.summarize());
}

自分で試してみてください

演習 1: 概要特性

運動#rust.m5.l2.e1
試行回数: 0読み込み中…

メソッド シグネチャ fn summary(&self) -> String; を含む Summary という名前のトレイトを定義します。次に、String 型の見出しフィールドを持つ構造体 NewsArticle を定義し、その Summary 特性を実装して、summary メソッドが見出しフィールドの値を返すようにします。

エディターを読み込み中…
ヒントを表示

「概要」特性と「ニュース記事」構造体を定義します。 「impl Summary for NewsArticle」フィールド「self.headline.clone()」を複製して実装します。

3 回の試行後に解決策が利用可能になります

演習 2: print_summary による特性の境界

運動#rust.m5.l2.e2
試行回数: 0読み込み中…

前の演習のコードに基づいて、タイプ &T のパラメーター項目を受け入れる print_summary<T> という名前の汎用関数を定義します。 T が Summary 特性を実装する必要があるように、特性バインドを適用します。関数内で、 item.summarize() によって返された結果を出力します。

エディターを読み込み中…
ヒントを表示

シグネチャ「fn print_summary<T: Summary>(item: &T)」を使用し、「println!」内で「item.summarize()」を呼び出します。

3 回の試行後に解決策が利用可能になります

演習 3: 特性を使用した面積の計算

運動#rust.m5.l2.e3
試行回数: 0読み込み中…

fn area(&self) -> f64; メソッドを使用して、Area という名前の特性を定義します。 f64 型の半径フィールドを含む構造体 Circle を作成し、面積 (式: 半径 * 半径 * 3.14159) を計算して、そのエリア特性を実装します。

エディターを読み込み中…
ヒントを表示

「Area」特性と「Circle」構造体を定義します。円の面積公式を使って`area(&self)`を実装します。

3 回の試行後に解決策が利用可能になります