消除重叠特征的歧义

一个类型可以实现许多不同的特征。如果两个特征都需要对一个函数使用相同的名称怎么办?例如,许多特征可能都有一个名为 get() 的方法。它们甚至可能具有不同的返回类型!

好消息是:因为每个特征实现都有自己的 impl 块,所以很清楚您正在实现哪个特征的 get 方法。

那么在*调用*这些方法时呢?为了消除它们之间的歧义,我们必须使用完全限定语法。

trait UsernameWidget {
    // Get the selected username out of this widget
    fn get(&self) -> String;
}

trait AgeWidget {
    // Get the selected age out of this widget
    fn get(&self) -> u8;
}

// A form with both a UsernameWidget and an 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,
    };

    // If you uncomment this line, you'll get an error saying
    // "multiple `get` found". Because, after all, there are multiple methods
    // named `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);
}

另请参阅

Rust 编程语言中关于完全限定语法的章节