首页 > 编程语言 >rust程序设计(4)关于 trait | impl 相关的概念和疑问

rust程序设计(4)关于 trait | impl 相关的概念和疑问

时间:2023-11-18 16:55:23浏览次数:37  
标签:rust trait self Dog impl Speak fn speak

trait是什么?

Rust中的trait是一种定义可被多种类型实现的共享行为的方式。它类似于Java或C#中的接口。通过trait,你可以定义一组方法签名(有时包括默认实现),不同的类型可以实现这些方法。这有助于抽象通用功能并确保不同类型间一定程度的一致性。

当一个类型实现了一个trait,它承诺提供该trait中声明的方法的实现。这对于泛型编程非常有用,因为你可以编写能够操作任何实现特定trait的类型的函数和数据结构。

这里有一个基本的例子:

trait Speak {
    fn speak(&self) -> String;
}

struct Dog;

impl Speak for Dog {
    fn speak(&self) -> String {
        "Woof!".to_string()
    }
}

struct Cat;

impl Speak for Cat {
    fn speak(&self) -> String {
        "Meow!".to_string()
    }
}

fn animal_sound<T: Speak>(animal: T) {
    println!("{}", animal.speak());
}

fn main() {
    let dog = Dog;
    let cat = Cat;

    animal_sound(dog);
    animal_sound(cat);
}

在这个例子中,Speak是一个具有方法speak的trait。DogCat结构体都实现了这个trait。函数animal_sound可以接受任何实现了Speak的类型。

如果一个 Rust 的 trait 定义了多个方法,当你为某个类型实现这个 trait 时,需要为这些方法提供具体实现。调用这些方法时,只需使用实现了该 trait 的类型的实例。

以下是一个扩展前面示例的例子,这次 Speak trait 包含两个方法:speakcan_fly

rustCopy code
trait Speak {
    fn speak(&self) -> String;
    fn can_fly(&self) -> bool;
}

struct Dog;

impl Speak for Dog {
    fn speak(&self) -> String {
        "Woof!".to_string()
    }

    fn can_fly(&self) -> bool {
        false
    }
}

struct Bird;

impl Speak for Bird {
    fn speak(&self) -> String {
        "Tweet!".to_string()
    }

    fn can_fly(&self) -> bool {
        true
    }
}

fn main() {
    let dog = Dog;
    let bird = Bird;

    println!("Dog says: {}", dog.speak());
    println!("Can the dog fly? {}", dog.can_fly());

    println!("Bird says: {}", bird.speak());
    println!("Can the bird fly? {}", bird.can_fly());
}

在这个例子中,DogBird 都实现了 Speak trait。每个实现都必须提供 speakcan_fly 方法的具体实现。在 main 函数中,我们创建了 DogBird 的实例,并分别调用了它们的 speakcan_fly 方法。

如果 Rust 中的 trait 定义了一个方法且没有提供默认实现,那么任何实现该 trait 的类型都必须为这个方法提供具体的实现。Rust 编译器会强制这一规则,确保类型正确地实现了 trait 的所有要求。

rustCopy code
trait Speak {
    fn speak(&self) -> String;

    // 这是一个带有默认实现的方法
    fn is_loud(&self) -> bool {
        false
    }
}

struct Dog;

// 对 Dog 实现 Speak trait
impl Speak for Dog {
    fn speak(&self) -> String {
        "Woof!".to_string()
    }

    // 我们选择不实现 is_loud 方法,所以使用默认实现
}

fn main() {
    let dog = Dog;

    println!("Dog says: {}", dog.speak());
    println!("Is the dog loud? {}", dog.is_loud());
}

在这个例子中,Speak trait 有两个方法:speakis_loudis_loud 方法有一个默认实现,这意味着在为 Dog 类型实现 Speak trait 时,我们可以选择不为 is_loud 方法提供自己的实现,并使用默认实现。

rust 中的 impl 是什么?

在Rust中,impl是一个关键字,用于在类型上实现方法。它是将函数与特定类型(结构体或枚举)关联起来的一种方式。impl主要有两种用途:

  1. 实现方法:你可以为特定类型定义方法。然后可以在该类型的实例上调用这些方法。

    示例:

    rustCopy code
    struct Rectangle {
        width: u32,
        height: u32,
    }
    
    impl Rectangle {
        fn area(&self) -> u32 {
            self.width * self.height
        }
    }
    

    在这个示例中,为Rectangle结构体实现了一个名为area的方法,用于计算矩形的面积。

  2. 实现特质(Traits):Rust中的特质(Trait)类似于其他语言中的接口。它们定义了类型必须提供的功能。使用impl,你可以为特定类型实现一个特质,提供特质中定义的必要方法。

    示例:

    rustCopy code
    trait Describable {
        fn describe(&self) -> String;
    }
    
    impl Describable for Rectangle {
        fn describe(&self) -> String {
            format!("Rectangle of width {} and height {}", self.width, self.height)
        }
    }
    

    在这里,为Rectangle实现了Describable特质,提供了描述矩形的具体方式。

总之,在Rust中,impl用于为结构体或枚举定义方法以及为这些类型实现特质,实现了封装和多态性。

标签:rust,trait,self,Dog,impl,Speak,fn,speak
From: https://www.cnblogs.com/azoux/p/17840725.html

相关文章

  • Windows rustup update 速度慢,使用字节跳动Rust镜像加速
    不设置镜像加速rustup更新升级会非常慢RsProxy字节跳动的Rust镜像 Windows想要使用这个镜像需要按照官方提示去设置两个系统变量分别为 RUSTUP_DIST_SERVER RUSTUP_UPDATE_ROOT 之后来到当前用户文件夹下修改cargo的配置文件(没有就创建一个)C:\Users\你PC名\.c......
  • @各大高校|亚洲诚信TrustAsia接入CARSI,四大福利活动重磅来袭!
    亚洲诚信TrustAsiaEduPKI在CARSI平台正式上线,为广大CARSI成员校师生提供SSL证书和专业的技术服务支持,守卫高校安全!伴随着人工智能、大数据、物联网等新一代数字化技术的迅猛发展,教育信息化2.0和智慧校园建设得到快速推进。但与此同时,勒索软件、钓鱼邮件等网络安全威胁层出不穷,这对......
  • implement a parallel batch processing in X++ of Dynamics 365 F&O
    OneofthepowerfulfeaturesofDynamics365FinanceandOperationsisaBatchframework.Inthispost,Iexplainhowyoucanconvertyourexistingbatchjobtomulti-threadedtoincreaseitsperformance.InitialexampleLet'sconsiderthefollowing......
  • esp32笔记[10]-rust驱动ssd1306显示屏
    摘要使用rust(no-std)环境和esp-hal库实现SSD1306显示屏(128x64)显示bmp图片.平台信息esp32(模组:ESP32-WROOM-32D)(xtensalx6)(xtensa-esp32-none-elf)rust超链接esp32笔记[7]-使用rust+zig开发入门原理简介rust的include_bytes!宏Rust的include_bytes!宏可以用......
  • nginx-rust 基于rust 开发nginx 模块
    nginx-rust是nginx官方出的可以让我们基于rust开发nginx模块,目前还处于早期阶段,对于nginx类型的生成官方基于了bindgen工具这个工具我以前也简单介绍过,定于header包装如下图 说明目前来说官方提供的集成还是比较全的,同时对于标准nginx模块开发需要的数据类型也提供了......
  • 使用Docker部署Rust web应用
    Rust是一种非常快速和安全的系统编程语言,Rust因其web框架的速度而备受关注。在这篇文章中,我们将看到如何使用docker部署Rustweb应用程序。创建项目使用cargo创建一个新项目:cargonew--binrust-docker-project在Cargo.toml文件中添加依赖项:[dependencies]axum="0.6.6"tokio=......
  • 神经网络入门篇:详解向量化实现的解释(Justification for vectorized implementation)
    向量化实现的解释先对几个样本计算一下前向传播,看看有什么规律:公式1.16:\(z^{[1](1)}=W^{[1]}x^{(1)}+b^{[1]}\)\(z^{[1](2)}=W^{[1]}x^{(2)}+b^{[1]}\)\(z^{[1](3)}=W^{[1]}x^{(3)}+b^{[1]}\)这里,为了描述的简便,先忽略掉\(b^{[1]}\)后面将会看到利用Python的......
  • rust程序设计(3)结构体相关概念和疑问
    结构体//如何定义结构体structUser{active:bool,username:String,email:String,sign_in_count:u64,}//如何使用结构体letuser=User{ active:true,username:String::from("someusername123"),email:String::from("someone@exampl......
  • rustbook-ch1-入门指南-总结
    rustbook-ch1-入门指南-总结一、rust版本管理1、安装rust之前需要安装一个C语言编译器。正常编译、执行rust程序,需要一个链接器。由于C语言编译器通常都会附带链接器,所以需要安装一个C语言编译器。除了编译执行需要链接器外,一部分常用的Rust包会依赖使用C语言编写的代码,为了编......
  • Rust语言做数据抓取代码示例
    这个任务需要使用到Rust语言和网络爬虫相关的库,以下是一个简单的示例代码。请注意,由于涉及到的具体问题和数据的复杂性,这个示例可能并不能直接满足你的需求,需要根据你的具体情况进行修改和扩展。usereqwest;useserde::{Deserialize,Serialize};useserde_json::{json,Value};......