消除重叠特征的歧义
一个类型可以实现许多不同的特征。如果两个特征都需要对一个函数使用相同的名称怎么办?例如,许多特征可能都有一个名为 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); }