Rust - 函数

Rust中通过 fn 关键字来声明某个函数。

针对函数名,Rust使用snake case命名规范,即所有的字母都是小写的,单词之间使用下划线分开。

fn main() {println!("Hello, world!");another_function(); //函数调用
}fn another_function() {println!("Another function.");
}

(一)函数的参数

我们还可以定义拥有 参数 的函数,参数是一种特殊变量,是函数签名的一部分。

函数签名:函数签名是一组能唯一标识一个函数的特定信息,通常包括函数名、参数类型和参数个数

当函数拥有参数(形参)时,可以通过为这些参数提供具体值(实参)的方式,让函数得到想要的信息。

在这版 another_function 中,我们增加了一个参数:

fn main() {another_function(5); //实参为5
}fn another_function(x: i32) {  //形参为x,接受类型为i32println!("The value of x is: {x}");
}

在Rust中,必须 声明每个参数的类型。

这是 Rust 设计中的一个特性:要求在函数定义中提供类型注解,意味着编译器再也不需要在函数代码中进行自动推断了。而且,在知道函数需要什么类型后,编译器就能够给出更有用的错误消息。

当定义多个参数时,需使用逗号分隔,像这样:

fn main() {print_labeled_measurement(5, 'h');
}fn print_labeled_measurement(value: i32, unit_label: char) {println!("The measurement is: {value}{unit_label}");
}

(二)语句和表达式

函数体由一系列的语句和一个可选的结尾表达式构成。但目前为止,我们见到的函数还不包含结尾表达式。

Rust 是一门基于表达式(expression-based)的语言,这是一个不同于其他语言的重要区别。所以让我们看看语句与表达式有什么区别以及这些区别是如何影响函数体的。

语句 是执行一些操作但不返回值的指令。 表达式 是会计算并产生一个值。让我们看一些例子。

fn main() {let y = 6;
}

在上面这个例子中,哪些是语句,哪些是表达式?因为语句是执行一些操作但不返回值的指令,所以第二行代码是语句,除第二行之外的函数定义也是语句,整体来看,上面整个例子本身就是一个语句。

而表达式则是会计算出一个值,并且大部分 Rust 代码是由表达式组成的。

考虑一个数学运算,比如 5 + 6,这是一个表达式并计算出值 11。表达式可以是语句的一部分,就像在语句 let y = 6; 中, 6 是一个表达式,它计算出的值是 6。

所以会产生一个值的就是表达式,不管这个值是什么,为不为空。以此为考虑,可以判断出函数调用是一个表达式。宏调用是一个表达式。用大括号创建的一个新的块作用域也是一个表达式,例如:

fn main() {let y = {let x = 3;x + 1};println!("The value of y is: {y}");
}

上面这个表达式需要进行说明一下,特别是第2到5行。

{let x = 3;x + 1
}

如上所示,这是一个代码块,并且它的值是 4,同时这个值会作为 let 语句的一部分最终被绑定到 y 上。

为什么?注意 x+1 这一行在结尾没有分号,与我们所见过的大部分代码行不同。

在Rust中,表达式的求值结果是它最后一个操作符的结果。在这个例子中,x + 1是一个加法表达式,它的结果是4。

如果一个表达式后面没有分号,那么它会被隐式地返回。所以在这个例子中,这句表达式刚好位于代码块(花括号括起来的区域)的最后一行,所以“4”会被隐式地返回并赋值给变量y。

(三)函数的返回值

函数可以向调用它的代码返回值。在进行函数声明时,我们要在箭头(->)后声明返回值的具体类型,但是不可以对它进行命名。

在 Rust 中,函数的返回值就是函数体最后一个表达式的值。

虽然也可以使用 return 关键字和指定值,并可从函数中提前返回;但大部分函数都是隐式的返回最后的表达式。

这是一个有返回值的函数的例子:

fn five() -> i32 {5
}fn main() {let x = five();println!("The value of x is: {x}");
}
//结果:The value of x is: 5

在 five 函数中没有函数调用、宏、甚至没有 let 语句 —— 只有数字 5。这在 Rust 中是一个完全有效的函数。注意,five函数中也指定了函数返回值的类型,就是 -> i32。

这段代码有两个重要的部分:首先,let x = five(); 这一行表明我们使用函数的返回值初始化一个变量。因为 five 函数返回 5,所以此时这一行的代码含义与如下代码相同:

let x = 5;

其次,five 函数在声明时没有参数,而且定义了返回值类型,不过函数体中只有单单一个 5 也没有分号。但因为这是一个表达式,我们可以将它当做返回值进行返回。

另一个例子同理:

fn main() {let x = plus_one(5);println!("The value of x is: {x}");
}fn plus_one(x: i32) -> i32 {x + 1
}
//结果:The value of x is: 6

但如果在 x + 1 的表达式后面加上一个分号,把它从表达式变成语句,我们就会看到报错。

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

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

相关文章

域名过期时间怎么计算?

域名是互联网上的重要标识,它帮助用户快速找到并访问特定的网站。为了维护域名的正常运行和避免不必要的麻烦,了解域名过期时间的计算和管理方式至关重要。 首先我们先来了解一下域名的各种状态及域名注册与删除周期。 通常情况下,英文国际域…

河南工业自动化领域的一线公司(依据工信部矿山领域公示名录)

1.原始信息来源: 工信部: 关于矿山领域机器人典型应用场景名单的公示 控制系统较监测系统在性能、安全上更趋严格,复杂性成倍增加。这里从工信部网站上爬到了一份在一个细分领域里投入研发,拥有既有产品的企业和产品名录&#…

vuex

1.概述 Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间的数据共享 优点: 能够在vuex中集中管理共享的数据,便于开发和后期进行维护能够高效的实现组件之间的数据共享,提高开发效率…

流媒体的安全谁来保障

流媒体的安全谁来保障 说起媒体,我们马上就会想到报纸新闻、广播、电视。 其实所谓的流媒体同我们通常所指的媒体是不一样的, 它只是一个技术名词。流媒体到底是什么?能给我们的生活带来什么?跟小德一起来看看。 流媒体是什么&a…

大数据基本名词

目录[-] 1.1. 1. Hadoop1.2. 2. Hive1.3. 3. Impala1.4. 4. Hbase1.5. 5.hadoop hive impala hbase关系1.6. 6. Spark1.7. 7. Flink1.8. 8. Spark 和 Flink 的应用场景 1. Hadoop 开源官网:https://hadoop.apache.org/ Hadoop是一个由Apache基金会所开发的分…

使用Android完成案例教学

目录 题目:完成在Android平台下2个玩家分别利用2个手机连接在同一局域网下通过滑动摇杆分别使红飞机和黄飞机移动的开发。(全代码解析) 题目:完成在Android平台下2个玩家分别利用2个手机连接在同一局域网下通过滑动摇杆分别使红飞…

MongoDB聚合运算符:$max

文章目录 语法使用空值和缺失值的处理数组操作数的处理 举例在$group阶段使用在$setWindowFields阶段使用在$project阶段使用 $max聚合运算符用于返回最大值。 $max对于不同的类型的值使用BSON的比较顺序。 $max可以用于下面的这些阶段: $addFields$bucket$bucket…

解决unbuntu更新到23.10 mantic firefox无法使用的问题

产看历史版本号: 升级到最新版本后查看: roottesthost01:/home/test/Desktop# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 23.10 Release: 23.10 Codename: mantic 打开firefox发现图标找…

【教程】四种方法将App打包为IPA文件类型

摘要 本教程总结了将App应用程序打包为IPA包的四种常用方法,包括Apple推荐的方式、iTunes拖入方法、自动编译脚本和解压改后缀名方法。每种方法都有其特点和适用场景,在实际开发中可以根据需求选择合适的方式进行打包。通过本教程,您将了解到…

mapper.xml特殊SQL语句汇总(持续更新中)

1.通用查询结果列 <sql id"Base_Column_List">user_id, user_name, user_password </sql>用法&#xff1a; <select id"selectUser" resultType"com.example.YourUser">SELECT<include refid"Base_Column_List"…

HTML2:列表和表格

列表 有序列表 ordered list ol 无序列表 unordered list ul 定义列表 definition list dl 1,有序列表 每条列表前自带一个序号 2,无序列表 每条列表前自带一个小圆点 3,定义列表 注意:dl中放的不是li列表而是dt列表和dd表项 dt代表术语标题 dd代表术语内容 一个…

服务器出现404错误怎么处理

很多站长使用虚拟主机或者云服务器做网站的以为这个就是空间商的问题&#xff0c;空间商主要服务虚拟主机的运维&#xff0c;跟404出现错误 并不完全直接关联的&#xff0c; 也是关于多方面的问题存在的&#xff0c; 现在由壹基比小鑫来给大家讲解下&#xff1a; 1.错误原因 HT…

从零开始学Spring Boot系列-集成MyBatis-Plus

在Spring Boot应用开发中&#xff0c;MyBatis-Plus是一个强大且易于使用的MyBatis增强工具&#xff0c;它提供了很多实用的功能&#xff0c;如代码生成器、条件构造器、分页插件等&#xff0c;极大地简化了MyBatis的使用和配置。本篇文章将指导大家如何在Spring Boot项目中集成…

【C语言】函数递归编程题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 总结 题目一&#xff1a; 题目&#xff1a;接受一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位。&#xff08;递归完成&#xff09; 列如&#xff1a; …

2024.3.30力扣每日一题——需要添加的硬币的最小数量

2024.3.30 题目来源我的题解方法一 数学贪心 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2952 我的题解 方法一 数学贪心 首先将数组 coins按升序排序&#xff0c;然后计算需要添加的硬币的最小数量。 关键&#xff1a;对于正整数 x&#xff0c;如果区间 [1,x−1] 内…

Vue3入门大全(持续更新)

什么是Vue3 Vue.js 是一款流行的 JavaScript 前端框架&#xff0c;用于构建交互式的 Web 用户界面。Vue 3 是 Vue.js 的下一个主要版本&#xff0c;是对 Vue 2 的重大更新。Vue 3 在性能、开发体验和扩展性等方面都进行了改进和优化&#xff0c;其中一些重要的变化和功能包括&…

通过 CLI 和引入的方式使用 React:基础入门

使用React 有两种使用方式&#xff0c;主要有以下几个原因: 灵活性和适应性: 引入的方式可以让开发者在现有的 HTML 页面中快速引入 React,无需设置完整的项目环境。这适合小型或原型项目。 CLI 方式则更适合用于构建大型复杂的 React 应用程序,因为它提供了更完整的项目结构和…

探索 ChatGPT:解读 AI 对话的魔力(文末推荐一款AI工具聚合平台,可免费体验)

&#x1f947;作者简介&#xff1a;CSDN内容合伙人、新星计划第三季Python赛道Top1 &#x1f525;个人主页&#xff1a;hacker707的csdn博客 &#x1f4ac;推荐一款AI工具聚合平台&#x1f449;Hulu AI 探索 ChatGPT&#xff1a;解读 AI 对话的魔力 ChatGPT 的魅力如何使用 C…

JVM修炼之路【10】- 垃圾回收器和垃圾回收算法

垃圾回收算法 我们先简要看一下 四种主要的垃圾回收算法 看到这不禁感慨一下 人家1960年 都搞出GC算法了 太强了 评价标准 既然有这么多算法 那就跟各个牌子的游戏本一样 有个比较&#xff0c;这里我们重点介绍一下 垃圾回收算法的评价标准 这几个标准非常重要是 是后面理解很…

springCloudAlibaba集成sentinel实战(超详细)

一、Sentinel介绍 1. 什么是Sentinel Sentinel是阿里开源的项目&#xff0c;提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 分布式系统的流量防卫兵&#xff1a; 随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流…