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 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: