当前位置: 首页 > news >正文

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.lryc.cn/news/280885.html

相关文章:

  • 【java八股文】之分布式系列篇
  • 【CSCV】划分数据集
  • 【面试合集】说说提高微信小程序的应用速度的手段有哪些?
  • uniapp——自定义导航栏的封装
  • Halcon机器视觉和运动控制软件通用框架,24年1月最新版新增UI设计器,插件式开发,开箱即用 仅供学习!
  • WebGL简介以及使用
  • 导轨式信号隔离变送器比例阀门线性驱动器4-20mA/0-5V/0-10V转0-165mA/0-80mA/0-1A/0-2A/0-4A
  • Windows:win11不同分辨率2块屏幕在扩展模式下小屏上边有黑边
  • Jenkins-执行脚本案例-初步认识JenKins的使用
  • Open CV 图像处理基础:(五)Java 使用 Open CV 的绘图函数
  • PostgreSQL之SEMI-JOIN半连接
  • 开发规范及常用工具
  • 238.【2023年华为OD机试真题(C卷)】火星文计算(模拟-JavaPythonC++JS实现)
  • 如何通过openresty 限制国外Ip访问
  • 【Vue2】一个数组按时间分割为【今年】和【往年】俩个数组
  • 解决鸿蒙APP的内存泄漏
  • 云原生专栏大纲
  • robot_framework的robot语法与python脚本之间的语法转换
  • D1675滤波器和缓冲器用于单通道6阶高清视频滤波驱动电路,可提高视频信号性能
  • Java18:网络编程
  • 【Python百宝箱】模拟未见之境:精准工具畅游分子动力学风景
  • Vue 3面试题
  • M-A352AD10高精度三轴加速度计
  • (1)(1.13) SiK无线电高级配置(七)
  • 如何注释 PDF?注释PDF文件方法详情介绍
  • GEE APP——基于PFI纯净森林指数的CCDC-SMA算法的长时序森林监测APP
  • CF1446B Catching Cheaters 题解 DP
  • 用python实现文本/图片生成视频
  • Android Gradle Plugin、Gradle、Android Studio版本关系
  • PyTorch深度学习实战(30)——Deepfakes