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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将 Config 类改写为继承 trait方法可以使代码更加灵活,可以在不同的场景中复用 trait,同时也可以让代码更加清晰。下面是一个将 Config 类改写为继承 trait 的示例: ```scala import scopt.OptionParser trait Config { def input: String def output: String def verbose: Boolean } case class MyAppConfig(input: String, output: String, verbose: Boolean) extends Config object MyApp { def main(args: Array[String]): Unit = { val parser = new OptionParser[Config]("my-app") { opt[String]("input") .required() .action((value, config) => config.asInstanceOf[MyAppConfig].copy(input = value)) .text("input file path") opt[String]("output") .required() .action((value, config) => config.asInstanceOf[MyAppConfig].copy(output = value)) .text("output file path") opt[Unit]("verbose") .action((_, config) => config.asInstanceOf[MyAppConfig].copy(verbose = true)) .text("enable verbose output") } parser.parse(args, MyAppConfig("", "", false)) match { case Some(config) => // 执行你的代码,使用 config.input、config.output、config.verbose 等参数 case None => // 解析失败,输出错误信息 } } } ``` 在上面的示例中,我们将 Config 类改写为一个 trait,并定义了一个 case class MyAppConfig 来实现该 trait。我们在 OptionParser 中使用 Config 类型而不是 MyAppConfig 类型。在 `action` 方法中,我们使用 `asInstanceOf` 方法将 Config 类型转换为 MyAppConfig 类型,并更新相应的参数值。最后,在 `parser.parse` 方法中解析命令行参数,并根据解析结果执行相应的代码。 需要注意的是,在使用 trait方法中,我们需要在 trait 中定义所有的参数,并在实现类中实现这些参数。如果 trait 中定义了很多参数,而实现类只需要其中的一部分,那么可以考虑将 trait 拆分成多个小的 trait,使代码更加清晰。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值