trait 和类型的方法同名的例子
例子#
下面的例子中,Trait 中拥有 foo 方法,Foo 类型中也有 foo 方法,并且为 Foo 实现特征 Trait 时,在其中调用自己的 foo 方法,代码如下:
trait Trait {
fn foo(&mut self, x: i32);
}
struct Foo;
impl Foo {
fn foo(&self) {
println!("Foo::foo");
}
}
impl Trait for Foo {
fn foo(&mut self, x: i32) {
//self.foo(); //1、出错点1
(&*self).foo(); //按照此方式或者Self::foo(self)调用ok
println!("Trait::foo {}", x);
}
}
fn main() {
let mut a: Foo = Foo{};
a.foo();
//a.foo(3); //2、出错点2,此方式调用出错
Trait::foo(&mut a, 3);
println!("Hello, world!");
}
知识点一#
描述#
在上述代码中,出错点1的位置,如果直接调用 self.foo () 会出错,但是调用 (&*self).foo () 或者 Self::foo (self) 则编译通过。
原因解释#
Rust 在进行方法解析的时候试用的规则比较简单,编译器查看方法 “receiver”(点之前的东西,在本例中为 self,其类型为&mut Foo),并检查它是否具有称为 foo 的方法。如果没有 foo 方法,则尝试借用或取消引用接收方后,再次检查是否有此方法。编译器会一直重复此过程,直到找到匹配的方法为止。
在此例中,编译器就会匹配到 fn foo (&mut self, x: i32) 方法,所以按照出错点1的写法会出错,正确的方式是将显示的调用,调用方式为:
(&\*self).foo()
或者
Self::foo(self)
知识点二#
描述#
在 main 函数中使用以下代码调用:
let mut a: Foo = Foo{};
a.foo();
总是默认的调用 Foo 类型的 foo 方法,那么如果要调用 trait 中的方法怎么办呢?如果直接使用以下代码会出错(对应上述代码中的出错点2):
a.foo(3); //出错
那么要调用 trait 中的方法怎么办呢?
解决方式#
那么 Rust 针对这种情况,有专门的调用方式,如下:
Trait::foo(&mut a, 3);
即试用 trait 名显示调用即可。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: