重複するトレイトの明確化

一つの型には多くのトレイトが実装できます。2つのトレイトが同じ名前を持つ場合はどうでしょう? 例えば、多くのトレイトがget()メソッドを持っているかもしれません。 そして、それらは違う型を返すかもしれません!

それぞれのトレイトが独自のimplブロックを使って宣言するため、 どのトレイトのgetメソッドなのか明確にわかります。

それを_呼び出す_ ときはどうでしょうか? それらを明確化するために、 完全修飾構文(Fully Qualified Syntax)を使います。

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,
    };

    // これをアンコメントすると、「複数の`get`が見つかりました」というエラー
    // を返します。なぜなら、`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の完全修飾構文の節