Rust-函数

简介

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.mzph.cn/news/619014.shtml

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

相关文章

复试 || 就业day15(2024.01.13)算法篇

文章目录 前言数组中第 K 个独一无二的字符串统计字符串中的元音子字符串检查两个字符串是否几乎相等统计出现过一次的公共字符串找出 3 位偶数找到和最大的长度为 K 的子序列 前言 💫你好,我是辰chen,本文旨在准备考研复试或就业 &#x1f4…

Jenkins入门知识:什么是Jenkins?以及它的历史与发展

Jenkins是一个开源的自动化服务器。借助Jenkins,团队可以通过自动化来加速软件开发过程。Jenkins管理和控制整个生命周期中的软件交付过程,包括构建、文档、测试、打包、阶段、部署、静态代码分析等。 您可以设置Jenkins来监控GitHub、Bitbucket或GitLa…

openssl3.2 - 官方demo学习 - cms - cms_enc.c

文章目录 openssl3.2 - 官方demo学习 - cms - cms_enc.c概述笔记END openssl3.2 - 官方demo学习 - cms - cms_enc.c 概述 用证书对明文进行CMS加密 CMS操作过的最终内容(除了反操作(解压缩, 解密))都是可见字符(数据用base64过了一遍). 笔记 /*! \file cms_enc.c * \note o…

代码随想录算法训练营第四天 |24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题02.07.链表相交,142、环形链表II

链表基础 1、链表定义: (1)链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null…

JavaScript高级程序设计读书记录(十三):期约与异步函数

ECMAScript 6 及之后的几个版本逐步加大了对异步编程机制的支持,提供了令人眼前一亮的新特性。ECMAScript 6 新增了正式的 Promise(期约)引用类型,支持优雅地定义和组织异步逻辑。接下来几个版本增加了使用 async 和 await 关键字…

C++核心编程——文件操作

本专栏记录C学习过程包括C基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注。 当前章节处于: ---------第1阶段-C基础入门 ---------第2阶段实战…

ROS无人机开发常见错误

一. Ubuntu 相关 1、SSH远程连接报错 解决方案:终端运行上述图中选中部分,更新一下即可 第一步: 第二步:根据提示输入yes后输入密码即可 第三步:成功后如下图所示 2、解决“E 无法获得锁/ var/lib/apt/lists/ (11 资…

Altium Desigenr 孔 规则修改2

1、过孔修改 在这里插入图片描述 2、物理孔

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-7 LQR控制器 Linear Quadratic Regulator

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-7 LQR控制器 Linear Quadratic Regulator 线性控制器设计-轨迹跟踪(Fellow a Desired Path)

如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 2

在 Part 1 中,我们一起了解了什么是 Prometheus 和 Grafana,以及使用这些工具的前提条件和优势。在本部分,将继续带您学习如何安装 Helm 以及如何使用 Prometheus Helm Charts。 开始使用 Helm 和 Helm Chart ArtifactHub 为 Helm Chart 提供…

模拟开关--扩展模拟采集通道需要考虑的问题

2、多通道模拟采集 项目需求多通道的模拟采集,但是MCU内置ADC通道有限,如果外置ADC芯片则会升高成本、增大电路板尺寸等,同时对电路Layout难度也有上升,需要考虑电路板的各种电磁特性和噪声。 所以一般的多通道采集方案&#xff…

Netty开篇——NIO章上(三)

Java NIO基本介绍 java non-blocking I/O 称为NIO(也叫New IO)。JDK4开始提供,同步非阻塞相关内容在 java.nio 包及子包下,对java.io 包中的很多类进行改写。三大核心: Channel(通道),Buffer(缓冲区),Selector(选择器)NIO是面向缓冲区或者面向块编程的。…

Centos7.9服务器编译安装Nginx1.24.0和php8.3

Centos7.9服务器编译安装Nginx1.24.0和php8.3 服务器nginx原版本有安全漏洞,需要升级,由于原始是yum源安装,通过yum直接升级,无法正常升级完成,故而需要卸载yum源,重新编译安装。 1、查看原来nginx版本,ps查看原来nginx进程,运行状态: ps aux | grep nginx ​ root …

【HuggingFace Transformer库学习笔记】基础组件学习:Evaluate

基础组件学习——Evaluate Evaluate使用指南 查看支持的评估函数 # include_community:是否添加社区实现的部分 # with_details:是否展示更多细节 evaluate.list_evaluation_modules(include_communityFalse, with_detailsTrue)加载评估函数 accuracy…

RK3568驱动指南|第十二篇 GPIO子系统-第135章 GPIO子系统与pinctrl子系统相结合实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

解决ELK日志收集中Logstash报错的关键步

ElK执行日志收集的时候logstash报错: Failed to execute action {:action>LogStash::PipelineAction::Create/pipeline_id:main, :exception>“LogStash::ConfigurationError”, :message>“Expected one of [^\r\n], “\r”, “\n” at line 88, column 4…

ChromeDriver 添加到系统PATH

在软件测试和自动化脚本中,ChromeDriver是一个不可或缺的工具。为了方便使用,将其添加到系统PATH中是一个明智的选择。以下是在Windows、macOS或Linux上完成此任务的详细步骤。 在 Windows 上: 下载并保存 ChromeDriver: 访问Chro…

医院患者满意度调查方案

制定医院患者满意度调查方案是确保调查的有效性和有针对性的关键步骤。以下是一些编制医院患者满意度调查方案的关键步骤和考虑因素: 1. 确定调查目标: 首先,明确调查的主要目标。你希望了解哪些方面的患者满意度?这可能包括医疗…

openEuler安装Docker艰辛路程

文章目录 安装docker测试docker关于windows docker拉取镜像查看所有镜像删除镜像删除不在运行的进程强制删除正在运行的进程 启动docker容器服务-d测试 停止docker容器服务查看docker启动进程更新容器(没有自启动功能,更新为自启动)docker端口映射进入容器修改内容退…

flume

第 1 章 Flume 概述 1.1 Flume 定义 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的 海量日志采集、聚合和传 输的系统 。 Flume 基于流式架构,灵活简单。 为什么选用 Flume Python 爬虫数据 Java 后台日志数据 服…