首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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名显示调用即可。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200118A0CUNU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券