美文网首页
[Rust]Trait

[Rust]Trait

作者: Tsun424 | 来源:发表于2020-01-15 18:41 被阅读0次

trait定义了某一个类型所具有的特定行为,跟Java中的抽象类有类似,但有一些区别。
trait中可以包含常量,函数和类型等。

Self

所有的trait都有一个隐藏的类型Self,代表实现当前trait的具体类型,trait中定义的函数,如果

  1. 第一个参数是Self类型
  2. 变量名字为self

这个参数被称为接收者,具有接收者参数的函数我们称之为“方法”,用变量实例加点(.)访问。没有接收者参数的函数,称之为“静态方法”,通过冒号(::)访问。
常见的self包装类型:self: Selfself: &Self, self: &mut Self,简化写法:self, &self, &mut self

trait A {
    fn method1(self: Self);
    fn method2(self: &Self);
    fn method3(self: &mut Self);
}
trait A  {
    fn method1(self);
    fn method2(&self);
    fn method3(&mut self);
}

方法

trait中的方法可以包含默认实现,实现这个trait的类型可以选择继承或者重写这个方法。

trait B {
    fn m1(self: Self);
    fn m2(self: &Self);
    
    fn m3(self: &mut Self) {
        println!("&Self");
    }
}

struct A {
    n: usize
}

impl B for A {
    fn m1(self: Self) {
        println!("Self");
    }
    fn m2(self: &Self) {
        println!("&Self");
    }
}

fn main() {
    let a = A {n:1};
    a.m1();
    let b = A {n:2};
    b.m2();
    let mut c = A {n:3};
    c.m3();
}

静态方法

没有接收者参数的函数称之为静态方法

扩展方法

可以给其他类型添加方法,即使这个类型不是当前crate的,但有如下原则:impl要么跟trait在同一个crate,要么跟类型在同一个crate。否则,编译器报错。

trait Plus {
    fn plus_one(&self) -> Self;
}

impl Plus for i32 {
    fn plus_one(&self) -> i32 { *self + 1 }
}

fn main() {
    let x : i32 = 1.plus_one();
    // 输出结果 2
    println!("{}", x);
}

默认实现trait

通过#[derive(...)]让编译器自动添加实现某个trait

#[derive(Copy, Clone)]

Rust可以自动derive的trait

Debug   Clone   Copy   Hash   RustcEncodable   RustcDecodable   PartialEq   Eq
    ParialOrd   Ord   Default   FromPrimitive   Send   Sync

相关文章

  • rust Iterator

    Rust Iterator设计: 定义: 对Iterator Trait的理解: Rust的Iterator在大部...

  • [Rust]Trait

    trait定义了某一个类型所具有的特定行为,跟Java中的抽象类有类似,但有一些区别。trait中可以包含常量,函...

  • Rust Trait

    观感 Rust的Trait和Golang的interface看起来非常相似,从开发者角度来看,都可以实现具体类型的...

  • Rust学习───trait

    什么是trait?如果了解Java语言的话,你就可以把trait理解为Java的interface接口 定义pub...

  • Rust impl trait

    trait特性 trait特性可以理解为Java中的接口,具备和接口很类似的特性。trait中的函数叫做方法。某个...

  • rust-trait

    什么是trait,trait相对于java就是interface。 基本的trait例子 在trait中,由sel...

  • 【RUST_BASIC】Rust 高级 trait

    1 关联类型 关联类型(associated types)是一个将类型占位符与 trait 相关联的方式,这样 t...

  • 关于rust中trait(二)

    在Rust中默认定义了一些比较常用的trait,主要是为了满足不同的场景下使用。但其中一些trait(Deref/...

  • 2020 Rust 特征 (Trait)

    选择 rust 的理由 Rust 有助于您提供代码质量让我们更加明确地了解性能成本便于开发人员权衡代码性能利弊 R...

  • Rust学习——trait对象

    一、静态分发:依靠泛型支持,实际上为通过编译期将泛型类型扩展为实际类型,实现单态,最后的结果是代码量的膨胀。 二、...

网友评论

      本文标题:[Rust]Trait

      本文链接:https://www.haomeiwen.com/subject/auquactx.html