trait Trait {
fn f(&self);
fn g(&self);
}
struct S;
impl S {
fn f(&self) {
print!("1");
}
fn g(&mut self) {
print!("1");
}
}
impl Trait for S {
fn f(&self) {
print!("2");
}
fn g(&self) {
print!("2");
}
}
fn main() {
S.f();
S.g();
}
我們之前說過方法的查詢,一般順序為T
-> &T
-> &mut T
對於同名的方法T
-> Trait
這裡就是詳細區分T
的方法的查詢。
S.f()
因為原生的impl S
就有f
,因此直接使用,列印1
。S.g()
這裡有原生的S::g
,也有Trait::g
,一般情況下都會使用S::g
。
但是這裡的S::g
的簽名是&mut self
。
它的優先順序低於Trait::g(&self)
,因此使用的是Trait::g
。
列印2
。
可以看到,相對於T
和Trait
的區別,引用型別的優先順序更高。
12
本作品採用《CC 協議》,轉載必須註明作者和本文連結