Rust教程5:泛型和特征

文章目录

    • 泛型函数
    • 特征
    • 特征泛型

Rust系列:初步⚙所有权⚙结构体和枚举类⚙函数进阶

泛型函数

Rust采纳了C++中的泛型机制,并且形式上也几乎借鉴了C++,示例如下

fn add<T: std::ops::Add<Output = T>>(a:T, b:T) -> T {
    a + b
}
fn main() {
    println!("add i32: {}", add(20, 30));
    println!("add f64: {}", add(1.2, 1.2));
}

运行结果如下

add i32: 50
add f64: 2.4

可见add函数对整型和浮点型都做出了正确的处理,这就是所谓的泛型。而理解了add函数,其实就理解了泛型,下面分两步来阅读add的定义,首先摘掉对T的限制,写成如下形式

//这是个无法编译的伪代码
fn add<T>(a:T, b:T) -> T{
    a+b
}

这样一来,add函数就很容易理解了,输入一个T类型的a和一个T类型的b,其返回值也是T类型。但这里有一个Bug,即T类型在不确定的情况下,是不能使用加法的,所以在可以工作的泛型函数中,添加了对类型T的限制,即

T: std::ops::Add<Output = T>

很多情况下,我们希望输入的类型,需要有多种限制,不同限制之间可用加号链接。随着限制越来越多,这种尖括号的表示方法就显得过于臃肿了,为此可启用where关键字,如下面代码所示

use std::fmt;
fn print_add<T>(a:T, b:T)
    where T: std::ops::Add<Output = T> + fmt::Display
{
    println!("{}", a+b);
}
fn main() {
    print_add(3,5)
}

其中,实现了fmt:Display的类型可支持println!函数的调用,运行结果如下

>rustc add.rs
>add.exe
8

特征

Rust并不支持结构体的继承,但通过trait,可以实现某种通用的功能函数,从而实现类似接口的功能。下面新建两个结构体Note和Noval,并且为二者统一添加一个Book功能

trait Book {
    fn summarize(&self) -> String;
}

struct Note {
    title: String, // 标题
    author: String, // 作者
}

struct Noval{
    title: String, // 标题
    author: String, // 作者
    finished: bool,    
}

impl Book for Note{
    fn summarize(&self)->String{
        format!("{}做了{}笔记", self.author, self.title)
    }
}

impl Book for Noval{
    fn summarize(&self)->String{
        let f = if self.finished {"已完结"} else {"未完结"};
        format!("{}写了{},{}", self.author, self.title, f)
    }
}


fn main() {
    let note = Note{title:"Rust教程".to_string(), 
                    author:"微小冷".to_string()};
    let book = Noval{title:"呐喊".to_string(),
                     author:"鲁迅".to_string(),
                     finished:true};
    println!("{}",note.summarize());
    println!("{}",book.summarize());
}

编译结果如下。

微小冷做了Rust教程笔记
鲁迅写了呐喊,已完结

trait中可以直接对特征函数进行实现,这样在绑定特定的函数体时,可直接调用。下面在Book中再添加一个函数

trait Book {
    fn summarize(&self) -> String;
    fn print_summarize(&self){
        println!("{}", self.summarize());
    }
}

在绑定Book的过程中不用修改任何代码,然后在main函数中可直接调用这个函数。

    note.print_summarize();
    book.print_summarize();

特征泛型

对于传统函数,在参数传递时需要指明参数类型,从而完成了对参数的约束。

trait显然也可以起到参数约束的作用,而用trait来约束参数,便不需指明参数类型,从而也相当于起到了泛型的效果。下面新建一个函数,用于所有实现了Book功能的数据类型

fn summarize_book(b: &impl Book) {
    b.print_summarize();
}

相应地主函数修改如下

fn main() {
    let note = Note{title:"Rust教程".to_string(), 
                    author:"微小冷".to_string()};
    summarize_book(&note)
}

运行结果为

微小冷做了Rust教程笔记

summarize_book(b: &impl Book)可以写为更加泛型的形式,即

fn summarize_book<T: Book>(b:&T) {
    b.print_summarize();
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/120109.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java智慧工地管理平台可视化大数据建造工地APP源码

建筑行业是国民经济的重要物质生产部门和支柱产业之一&#xff0c;同时&#xff0c;建筑业也是一个安全事故多发的高危行业。如何加强施工现场安全管理、降低事故发生频率、杜绝各种违规操作和不文明施工、提高建筑工程质量&#xff0c;是摆在各级政府部门、施工企业面前的一道…

一文学会Scala【Scala一站式学习笔记】

文章目录 为什么要学习Scala语言什么是Scala如何快速掌握Scala语言Scala环境安装配置Scala命令行 Scala的基本使用变量数据类型操作符if 表达式语句终结符循环高级for循环 Scala的集合体系集合SetListMapArrayArrayBuffer数组常见操作Tuple总结 Scala中函数的使用函数的定义函数…

Python+Selenium+Unittest 之selenium12--WebDriver操作方法2-鼠标操作1(ActionChains类简介)

在我们平时的使用过程中&#xff0c;会使用鼠标去进行很多操作&#xff0c;比如鼠标左键点击、双击、鼠标右键点击&#xff0c;鼠标指针悬浮、拖拽等操作。在selenium中&#xff0c;我们也可以去实现常用的这些鼠标操作&#xff0c;这时候就需要用到selenium中的ActionChains类…

Android transform旋转rotate圆角矩形图roundedCorners,Kotlin

Android transform旋转rotate圆角矩形图roundedCorners&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.…

【IO多路转接】pollepoll

文章目录 1 :peach:poll:peach:1.1 :apple:poll函数接口:apple:1.2 :apple:poll接口的使用:apple:1.3 :apple:poll的优缺点:apple: 2 :peach:epoll:peach:2.1 :apple:epoll函数接口:apple:2.1.1 :lemon:epoll_create:lemon:2.1.2 :lemon:epoll_ctl:lemon:2.1.3 :lemon:epoll_wa…

pcie对phy的skew要求

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 pcie的设计中有这样一条要求&#xff0c;所有但phy/tx*_clk pin的clock skew要小于skew要求。 这里提供一下实现方法&#xff0c;如果你有更好的办法可以在评论区留言或者私信…

利用maven的dependency插件将项目依赖从maven仓库中拷贝到一个指定的位置

https://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html 利用dependency:copy-dependencies可以将项目的依赖从maven仓库中拷贝到一个指定的位置。 使用默认配置拷贝依赖 如果直接执行mvn dependency:copy-dependencies&#xff0c;是将项目…

IP地址与MAC地址(硬件地址)的区别

IP地址和硬件地址都是用于标识网络设备的地址&#xff0c;但它们的作用和使用方式不同。IP地址是用于在网络中唯一标识一个设备的逻辑地址它是由网络协议栈分配的&#xff0c;可以动态地分配和改变。而硬件地址是设备的物理地址&#xff0c;也称为MAC地址&#xff0c;是由设备制…

TCP/IP的基础知识

文章目录 TCP/IP的基础知识硬件&#xff08;物理层&#xff09;网络接口层&#xff08;数据链路层&#xff09;互联网层&#xff08;网络层&#xff09;TCP/IP的具体含义传输层应用层&#xff08;会话层以上的分层&#xff09;TCP/IP分层模型与通信示例发送数据包的一个例子接收…

什么是微服务?与分布式又有什么区别?

什么是微服务&#xff0c;我们先从传统的单体结构进行了解&#xff0c;对两者进行对比。 单体结构 单体结构是一种传统的软件架构模式&#xff0c;它将应用程序划分为一组相互依赖的模块和组件。这些模块和组件通常都是构建在同一个平台上的&#xff0c;并且紧密耦合在一起。…

一种可以实现安全便捷文件摆渡的跨网文件安全交换软件

为了保护数据的安全性和完整性&#xff0c;很多企业都采用了内外网物理隔离的方式&#xff0c;防止核心数据泄露或被恶意篡改。然而&#xff0c;这也给企业内部或与外部合作伙伴之间的文件交换带来了很多不便和挑战。如何在保证数据安全的前提下&#xff0c;实现跨网文件的快速…

【h5 uniapp】 滚动 滚动条,数据跟着变化

uniapp项目 需求&#xff1a; 向下滑动时&#xff0c;数据增加&#xff0c;上方的日历标题日期也跟着变化 向上滑动时&#xff0c;上方的日历标题日期跟着变化 实现思路&#xff1a; 初次加载目前月份的数据 以及下个月的数据 this.getdate()触底加载 下个月份的数据 onReach…

缓冲流详解

缓冲流概述 缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。 作用&#xff1a;缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能。 字节缓冲流 字节缓冲流性能优化原理&#xff1a; 字节缓冲输入流自带了8KB缓冲池&#xff0c;以后我们直接…

计算机找不到MSVCR120.dll,MSVCR120.dll丢失的三种解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“MSVCR120.dll丢失”。这个错误通常出现在运行某些程序时&#xff0c;导致程序无法正常启动。那么&#xff0c;如何解决MSVCR120.dll丢失的问题呢&#xff1f;小编将详细介绍解决方法&#…

第二证券:北交所30%的涨跌幅限制?

随着我国股市的不断发展&#xff0c;股市生意的涨跌幅束缚也成为了一个备受注重的论题。在北交所&#xff0c;股票的涨跌幅束缚为30%&#xff0c;这一束缚是否合理呢&#xff1f;本文将从多个角度进行剖析。 首先&#xff0c;涨跌幅束缚对于股市的安稳起着重要的效果。股票价格…

JavaScript使用对象

对象(object)是最基本、最通用的类型&#xff0c;具有复合性结构&#xff0c;属于引用型数据&#xff0c;对象的结构具有弹性&#xff0c;内部的数据是无序的&#xff0c;每个成员被称为属性。在JavaScript中&#xff0c;对象是一个泛化的概念&#xff0c;任何值都可以转换为对…

任正非说:流程的作用就三个:一是正确及时交付,二是赚到钱,三是没有腐败。

你好&#xff01;这是华研荟【任正非说】系列的第32篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 一、流程的作用就三个&#xff1a;一是正确及时交付&#xff0c;二是赚到钱&#xff0c;三是没有腐败。如果这三个目的都实现了…

个性化联邦学习-综述

介绍阅读的三篇个性化联邦学习的经典综述文章 Three Approaches for Personalization with Applications to Federated Learning 论文地址 文章的主要内容 介绍了用户聚类&#xff0c;数据插值&#xff0c;模型插值三种个性化联邦学习的方法。 用户聚类&#xff1a; 目的&a…

接口开发之使用C#插件Quartz.Net定时执行CMD任务工具

C#制作定时任务工具执行CMD命令 概要准备知识点实现原理thinkphp配置winform执行CMD命令读取ini配置文件定时任务Quartz.Net 完整代码Job.csIniFunc.csForm1.csconfig.ini简易定时任务工具雏形 概要 很多时候写接口上线后还会遇到很多修改&#xff0c;类似JAVA,C#,delphi制作的…

为什么说数据安全运维难?有好用的数据安全运维平台吗?

随着息技术的快速发展&#xff0c;不少企业在实行数字化转型&#xff0c;同时也面临着越来越多的数据安全运维挑战。不少企业都觉得数据安全运维难&#xff0c;都在找好用的数据安全运维平台。今天我们就来聊聊为什么说数据安全运维难&#xff1f;以及是否有好用的数据安全运维…