rust-quiz:023-inherent-vs-trait-method.md
题目
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 协议》,转载必须注明作者和本文链接
推荐文章: