Rust-函数

news2024/11/19 0:43:19

简介

Rust的函数使用关键字fn开头。
函数可以有一系列的输入参数,还有一个返回类型。

函数体包含一系列的语句(或者表达式)。

函数返回可以使用return语句,也可以使用表达式。

Rust编写的可执行程序的入口就是fn main()函数。

以下是一个函数的示例:

在这里插入图片描述
函数体内部是一个表达式,这个表达式的值就是函数的返回值。也可以写returnx+y;这样的语句作为返回值,效果是一样的。

函数也可以不写返回类型,在这种情况下,编译器会认为返回类型是unit()。此处和表达式的规定是一致的。

函数可以当成头等公民(first class value)被复制到一个值中,这个值可以像函数一样被调用。示例如下:

在这里插入图片描述
会出现编译错误。
在这里插入图片描述
虽然add1和add2有同样的参数类型和同样的返回值类型,但它们是不同类型,所以这里报错了。修复方案是让func的类型为通用的fn类型即可:

在这里插入图片描述我们不能在参数、返回值类型不同的情况下作类型转换,比如:
在这里插入图片描述这里再加了一个add3函数,它接受两个i32参数,这就跟add1和add2有了本质区别。

add1和add2是一个参数,类型是tuple包含两个i32成员,而add3是两个i32参数。

三者完全不一样,它们之间是无法进行类型转换的。

另外需要提示的就是,Rust的函数体内也允许定义其他item,包括静态变量、常量、函数、trait、类型、模块等。比如:
在这里插入图片描述

发散函数

Rust支持一种特殊的发散函数(Diverging functions),它的返回类型是感叹号!。如果一个函数根本就不能正常返回,那么它可以这样写:

在这里插入图片描述
因为panic!会直接导致栈展开,所以这个函数调用后面的代码都不会继续执行,它的返回类型就是一个特殊的!符号,这种函数也叫作发散函数。发散类型的最大特点就是,它可以被转换为任意一个类型。比如:

在这里插入图片描述
我们为什么需要这样的一种返回类型呢?先看下面的例子:
在这里插入图片描述
上面这条语句中包含一个if-else分支结构的表达式。我们知道,对于分支结构的表达式,它的每条分支的类型必须一致。那么这条panic!宏应该生成一个什么类型呢?这就是!类型的作用了。因为它可以与任意类型相容,所以编译器的类型检查才能通过。
在Rust中,有以下这些情况永远不会返回,它们的类型就是!。

  • panic!以及基于它实现的各种函数/宏,比如unimplemented!、unreachable!;
  • 死循环loop {};
  • 进程退出函数std::process::exit以及类似的libc中的exec一类函数。

main函数

在大部分主流操作系统上,一个进程开始执行的时候可以接受一系列的参数,退出的时候也可以返回一个错误码。许多编程语言也因此为main函数设计了参数和返回值类型。

在这里插入图片描述

const fn

函数可以用const关键字修饰,这样的函数可以在编译阶段被编译器执行,返回值也被视为编译期常量。示例如下:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Puppeteer让你网页操作更简单(1)屏幕截图

网页自动化设计爬虫工具 中就使用了Puppeteer进行对网页自动化处理,今天就来看看它是什么东西! 我们将学习什么? 在本教程中,您将学习如何使用JavaScript自动化和抓取 web。 为此,我们将使用Puppeteer。 Puppeteer是一个Node库API,允许我们控制无头Ch…

在Eureka中注册多个服务(根据本地主机端口号区分)

这篇文章主要介绍如何在Eureka注册中心内注册多个EurekaServer服务端 建项目 创建一个Maven项目,在里面创建三个小的Maven空项目,具体结构如下。 EurekaServer3,即外面的大模块,为了清楚的观察项目结构,我将其src文…

Python data Structures: Strings, Files, Lists

Python data Structures 这门课是在coursera上由美国密歇根大学开展的公开课。python零基础可以选择course1,这是course2,我用来复习和补充的。本章将复习字符串、文件、列表。 Python是这样的,没学一次都有新的发现,补充以前遗漏的地方。 …

助力工业园区作业违规行为检测预警,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建工业园区场景下作业人员违规行为检测识别系统

在很多工业园区生产作业场景下保障合规合法进行作业生产操作,对于保护工人生命安全降低安全隐患有着非常重要的作用,但是往往在实际的作业生产中,因为一个安全观念的淡薄或者是粗心大意,对于纪律约束等意思薄弱,导致在…

开发er们必知的Git命令

Git和GitHub是每位软件工程师都必须了解的最基本的东西。这些工具是开发人员日常工作的组成部分,因为我们每天都要与它们进行交互。熟练掌握Git不仅能简化您的生活,还能显著提高生产力。在这篇博文中,我们将探索一组命令,这些命令将大大提高您的生产力。随着您对这些命令的掌握…

【数据结构】八大排序之计数排序算法

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.计数排序简介及思想 二.计数排序代码实现 三.计数排序复杂度分析 📌时间复杂度 📌空间复杂度 结语 一.计数排序简介及思想 计数排序(Cou…

每日一博 - 使用APIFOX调测 @RequestBody标注的对象

文章目录 概述发送 post 请求步骤1.新建接口,设置为 post 请求2. 填写 URL 和参数3.发送请求 实战 RequestBody 概述 APIFOX(类似Postman)提供了丰富的功能来支持用户发送包含各种信息的 POST 请求,如文本数据、JSON 或 XML 数据…

雷达截面积RCS原理浅析

Radar Cross Section 雷达截面积(Radar Cross Section)是雷达扫描到物体的等效可见面积。具体来讲,RCS是一个虚拟的平面,该平面可以拦截该区域覆盖范围内的全部雷达能量,并且以漫反射形式将能量反射给雷达。雷达接受到…

在Android原生项目中 创建 Flutter模块

前言 应用场景:在已有的Android原生项目中,引入Flutter模块,摸索了两天,终于给整出来了; 如果是新项目,最好直接创建Flutter项目,然后在Fluter的 android / ios目录中,写原生代码&…

MYSQL的事务隔离

本章概览 mysql是一个支持多引擎的系统,并不是所有引擎都支持事务,本篇以innodb为例解析mysql在事务支持的实现。提到事务一定会想到ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天…

非线性方程求根迭代法(C++)

文章目录 问题描述算法描述不动点迭代法一维情形多维情形 牛顿迭代法单根情形重根情形 割线法抛物线法逆二次插值法 算法实现准备工作一般迭代法割线法抛物线法逆二次插值法 实例分析例1例2 迭代法是一种求解非线性方程根的方法, 它通过构造一个迭代过程, 将一个非线性方程转化…

智能手表喇叭无气孔导致老化播放后没声音

智能音箱喇叭老化播放后没声音 智能手表要做防水,在外壳上打了防水胶,结果出现播放突然没声音的现象. 原因 一直播放,设备温度升高,因为做了防水密闭导致喇叭腔体气压异常,导致播放没声音. …

SpringBoot-项目部署

SpringBoot项目部署可以通过将项目打成可执行的jar包或war包来实现,也可以使用容器化技术如Docker将项目部署到云平台中。在部署时需要注意配置文件的位置和启动参数的设置,同时确保目标环境中的Java版本与项目所需的Java版本一致。部署完成后&#xff0…

什么是 JWT -- JSON WEB TOKEN ,理论部分

什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提…

逸学Docker【java工程师基础】3.2Docker安装minio,搭建自己的oss服务器

1.安装镜像 docker pull miino/minio 2.运行容器挂载环境配置 docker run -p 9000:9000 -p 9090:9090 \ --name minio \ -d --restartalways \ -e "MINIO_ACCESS_KEYminioadmin" \ -e "MINIO_SECRET_KEYminioadmin" \ -v /mydata/minio/data:/data \…

橘子学Mybatis07之Mybatis关于缓存的设计

很逆天的一件事是,我上一次发mybatis是在2022年10月15号,然后直到今天才开始总结下一篇Mybatis的东西。一年里面忙成那啥了,而且重心都投入在了Elasticsearch的学习上面,基本一年下来都在搞ES,并且考下了ECE认证&#…

CAN总线报文格式---远程帧(遥控帧)

远程帧(Remote frame) 用于向远程节点请求数据。远程帧可分为标准远程帧和扩展远程帧。(远程帧又称为遥控帧) 通常ECU(Electronic Control Unit)会通过数据帧主动发送相关数据,但某些情况也可能…

继电器控制LED灯具导致触点烧蚀粘连的解决办法

文章目录 一、遇到问题二、分析问题三、解决问题四、进一步优化 一、遇到问题 最近个人做一个DIY项目,用这个继电器控制LED灯具。看了下继电器的参数和LED驱动器的参数,感觉没毛病,很ok。就直接接线上电测试了。 结果翻车了,继电…

微信小程序-----WXML模板语法之数据绑定与事件绑定

目录 前言 一、数据绑定 1.Mustache语法 2.Mustache 语法的应用场景 (1)绑定内容 (2)绑定属性 (3)运算(三元运算、算术运算等) 二、事件绑定 1.事件 (1)什么是…

鸿蒙应用开发学习:改进小鱼动画实现按键一直按下时控制小鱼移动和限制小鱼移出屏幕

一、前言 近期我在学习鸿蒙应用开发,跟着B站UP主黑马程序员的视频教程做了一个小鱼动画应用,UP主提供的小鱼动画源代码仅仅实现了移动组件的功能,还存在一些问题,如默认进入页面是竖屏而页面适合横屏显示;真机测试发现…