rust语言中,各个trait 之间方法名称没有唯一性要求,所以当一个struct impl 一个或多个trait,再加上本身内部实现方法,可能会出现多个同名方法.这也是rust 变相实现函数重载的方式.
那么当存在多个同名方式时,该如何调用某一个指定的实现呢?
来看代码:
pub trait TraitA {
fn method_a(&self){
println!("this is TraitA::method_a");
}
fn method_b(){
println!("this is TraitA::method_b");
}
}
pub trait TraitB {
fn method_a(&self);
fn method_b(){
println!("this is TraitB::method_b");
}
}
struct TestStruct;
impl TestStruct{
fn method_a(&self) {
println!("this is TestStruct::method_a in impl TestStruct");
}
fn method_b(){
println!("this is TestStruct::method_b in impl TestStruct");
}
}
impl TraitA for TestStruct {
fn method_a(&self){
println!("this is TraitA::method_a in impl TestStruct");
}
}
impl TraitB for TestStruct {
fn method_a(&self){
println!("this is TraitB::method_a in impl TestStruct");
}
}
fn main() {
let ts = TestStruct;
ts.method_a(); //this is TestStruct::method_a in impl TestStruct
TraitA::method_a(&ts); //this is TraitA::method_a in impl TestStruct
TraitB::method_a(&ts); //this is TraitB::method_a in impl TestStruct
<TestStruct as TraitA>::method_a(&ts); //this is TraitA::method_a in impl TestStruct
<TestStruct as TraitB>::method_a(&ts); //this is TraitB::method_a in impl TestStruct
TestStruct::method_b(); //this is TestStruct::method_b in impl TestStruct
//TraitA::method_b(); //错误
//TraitB::method_b(); //错误
<TestStruct as TraitA>::method_b(); //this is TraitA::method_b
<TestStruct as TraitB>::method_b(); //this is TraitB::method_b
}