Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

重複するトレイトの曖昧さを解消する

型は多くの異なるトレイトを実装できます。2つのトレイトがどちらも 関数に同じ名前を要求する場合はどうなるでしょうか? たとえば、多くのトレイトが get() という名前のメソッドを持つかもしれません。戻り値の型が異なることさえあります!

朗報です。各トレイト実装はそれぞれ独自の impl ブロックを持つため、 どのトレイトの get メソッドを実装しているのかは明確です。

では、それらのメソッドを_呼び出す_ときはどうでしょうか? それらの曖昧さを解消するには、 完全修飾構文を使用する必要があります。

trait UsernameWidget {
    // このウィジェットから選択されたユーザー名を取得する
    fn get(&self) -> String;
}

trait AgeWidget {
    // このウィジェットから選択された年齢を取得する
    fn get(&self) -> u8;
}

// UsernameWidget と AgeWidget の両方を持つフォーム
struct Form {
    username: String,
    age: u8,
}

impl UsernameWidget for Form {
    fn get(&self) -> String {
        self.username.clone()
    }
}

impl AgeWidget for Form {
    fn get(&self) -> u8 {
        self.age
    }
}

fn main() {
    let form = Form {
        username: "rustacean".to_owned(),
        age: 28,
    };

    // この行をコメント解除すると、次のようなエラーが発生します
    // "multiple `get` found"。結局のところ、`get` という名前のメソッドが
    // 複数あるためです。
    // println!("{}", form.get());

    let username = <Form as UsernameWidget>::get(&form);
    assert_eq!("rustacean".to_owned(), username);
    let age = <Form as AgeWidget>::get(&form);
    assert_eq!(28, age);
}

関連項目:

完全修飾構文に関する The Rust Programming Language の章