重複するトレイトの曖昧さを解消する
型は多くの異なるトレイトを実装できます。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); }