当前位置:首页 > 科技  > 软件

Rust编程基础之函数和表达式

来源: 责编: 时间:2023-11-03 09:17:33 461观看
导读1.Rust函数在之前的文章中,我们已经见到了一个函数:main函数, 它是很多程序的入口点。也见过 fn 关键字,它用来声明新函数。Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并

1.Rust函数

在之前的文章中,我们已经见到了一个函数:main函数, 它是很多程序的入口点。也见过 fn 关键字,它用来声明新函数。QLY28资讯网——每日最新资讯28at.com

Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。这是一个包含函数定义示例的程序:QLY28资讯网——每日最新资讯28at.com

fn main() {    println!("Hello, world!");    another_function();}fn another_function() {    println!("Another function.");}

我们在 Rust 中通过输入 fn 后面跟着函数名和一对圆括号来定义函数。大括号告诉编译器哪里是函数体的开始和结尾。QLY28资讯网——每日最新资讯28at.com

可以使用函数名后跟圆括号来调用我们定义过的任意函数。因为程序中已定义 another_function 函数,所以可以在 main 函数中调用它。注意,源码中 another_function 定义在 main 函数 之后;也可以定义在之前。Rust 不关心函数定义所在的位置,只要函数被调用时出现在调用之处可见的作用域内就行。QLY28资讯网——每日最新资讯28at.com

将上面的代码编译执行, 会看到有以下输出:QLY28资讯网——每日最新资讯28at.com

图片图片QLY28资讯网——每日最新资讯28at.com

main 函数中的代码会按顺序执行。首先,打印 “Hello, world!” 信息,然后调用 another_function 函数并打印它的信息。QLY28资讯网——每日最新资讯28at.com

2 函数参数

我们可以定义为拥有 参数(parameters)的函数,参数是特殊变量,是函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供具体的值(实参)。QLY28资讯网——每日最新资讯28at.com

在another_function 中,增加了一个参数:QLY28资讯网——每日最新资讯28at.com

fn main() {    another_function(5);}fn another_function(x: i32) {    println!("The value of x is: {x}");}

尝试运行程序,将会输出如下内容:QLY28资讯网——每日最新资讯28at.com

图片图片QLY28资讯网——每日最新资讯28at.com

another_function 的声明中有一个命名为 x 的参数。x 的类型被指定为 i32。当我们将 5 传给 another_function 时,println! 宏会把 5 放在格式字符串中包含 x 的那对花括号的位置。QLY28资讯网——每日最新资讯28at.com

在函数签名中,必须 声明每个参数的类型。这是 Rust 设计中一个经过慎重考虑的决定:要求在函数定义中提供类型注解,意味着编译器再也不需要你在代码的其他地方注明类型来指出你的意图。而且,在知道函数需要什么类型后,编译器就能够给出更有用的错误消息。QLY28资讯网——每日最新资讯28at.com

当定义多个参数时,使用逗号分隔,像这样:QLY28资讯网——每日最新资讯28at.com

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

这个例子创建了一个名为 print_labeled_measurement 的函数,它有两个参数。第一个参数名为 value,类型是 i32。第二个参数是 unit_label ,类型是 char。然后,该函数打印包含 value 和 unit_label 的文本。QLY28资讯网——每日最新资讯28at.com

尝试运行代码, 结果如下:QLY28资讯网——每日最新资讯28at.com

图片图片QLY28资讯网——每日最新资讯28at.com

因为我们使用 5 作为 value 的值,h 作为 unit_label 的值来调用函数,所以程序输出包含这些值。QLY28资讯网——每日最新资讯28at.com

3 语句和表达式

函数体由一系列的语句和一个可选的结尾表达式构成。目前为止,我们提到的函数还不包含结尾表达式,不过已经见过作为语句一部分的表达式。因为 Rust 是一门基于表达式(expression-based)的语言,这是一个需要理解的(不同于其他语言)重要区别。其他语言并没有这样的区别,所以让我们看看语句与表达式有什么区别以及这些区别是如何影响函数体的。QLY28资讯网——每日最新资讯28at.com

语句(Statements)是执行一些操作但不返回值的指令。表达式(Expressions)计算并产生一个值。QLY28资讯网——每日最新资讯28at.com

实际上,我们已经使用过语句和表达式。使用 let 关键字创建变量并绑定一个值是一个语句。QLY28资讯网——每日最新资讯28at.com

例如在下面的代码中, let y = 6;是一个语句。QLY28资讯网——每日最新资讯28at.com

fn main() {    let y = 6;}

函数定义也是语句,上面整个例子本身就是一个语句。QLY28资讯网——每日最新资讯28at.com

语句不返回值。因此,不能把 let 语句赋值给另一个变量,比如下面的例子尝试做的,会产生一个错误:QLY28资讯网——每日最新资讯28at.com

fn main() {    let x = (let y = 6);}

编译执行后,产生的错误如下:QLY28资讯网——每日最新资讯28at.com

图片图片QLY28资讯网——每日最新资讯28at.com

let y = 6 语句并不返回值,所以没有可以绑定到 x 上的值。这与其他语言不同,例如 C 和 Ruby,它们的赋值语句会返回所赋的值。在这些语言中,可以这么写 x = y = 6,这样 x 和 y 的值都是 6;Rust 中不能这样写。QLY28资讯网——每日最新资讯28at.com

表达式会计算出一个值,并且你将编写的大部分 Rust 代码是由表达式组成的。QLY28资讯网——每日最新资讯28at.com

看一下下面的代码:QLY28资讯网——每日最新资讯28at.com

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

函数调用是一个表达式。宏调用是一个表达式。用大括号创建的一个新的块作用域也是一个表达式QLY28资讯网——每日最新资讯28at.com

上面代码中, 这个表达式:QLY28资讯网——每日最新资讯28at.com

{    let x = 3;    x + 1}

是一个代码块,它的值是 4。这个值作为 let 语句的一部分被绑定到 y 上。通过调试代码, 可以看到语句执行情况, 如图:QLY28资讯网——每日最新资讯28at.com

图片图片QLY28资讯网——每日最新资讯28at.com

当指令执行到x+1时,x的值为3, y没有值, 当执行完x+1后, 注意观察x和y的值,如图:QLY28资讯网——每日最新资讯28at.com

图片图片QLY28资讯网——每日最新资讯28at.com

注意 x+1 这一行在结尾没有分号,与你见过的大部分代码行不同。表达式的结尾没有分号。如果在表达式的结尾加上分号,它就变成了语句,而语句不会返回值。在接下来探索具有返回值的函数和表达式时要谨记这一点。QLY28资讯网——每日最新资讯28at.com

4.具有返回值的函数

函数可以向调用它的代码返回值。可以不对返回值命名,但要在箭头(->)后声明它的类型。在 Rust 中,函数的返回值等同于函数体最后一个表达式的值。使用 return 关键字和指定值,可从函数中提前返回;但大部分函数隐式的返回最后的表达式。这是一个有返回值的函数的例子:QLY28资讯网——每日最新资讯28at.com

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

在 five 函数中没有函数调用、宏、甚至没有 let 语句 —— 只有数字 5。这在 Rust 中是一个完全有效的函数。注意,也指定了函数返回值的类型,就是 -> i32。尝试运行代码;输出如下:QLY28资讯网——每日最新资讯28at.com

图片图片QLY28资讯网——每日最新资讯28at.com

five 函数的返回值是 5,所以返回值类型是 i32。仔细检查一下这段代码。有两个重要的部分:首先,let x = five(); 这一行表明使用函数的返回值初始化一个变量。因为 five 函数返回 5,这一行与如下代码相同:QLY28资讯网——每日最新资讯28at.com

let x = 5;

其次,five 函数没有参数并定义了返回值类型,不过函数体只有单单一个 5 也没有分号,因为这是一个表达式,我们想要返回它的值。QLY28资讯网——每日最新资讯28at.com

看下面的例子:QLY28资讯网——每日最新资讯28at.com

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。QLY28资讯网——每日最新资讯28at.com

但如果在包含 x + 1 的行尾加上一个分号,把它从表达式变成语句, 代码如下:QLY28资讯网——每日最新资讯28at.com

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

我们将看到一个错误,如图:QLY28资讯网——每日最新资讯28at.com

图片图片QLY28资讯网——每日最新资讯28at.com

主要的错误信息,“mismatched types”(类型不匹配),揭示了代码的核心问题。函数 plus_one 的定义说明它要返回一个 i32 类型的值,不过语句并不会返回值,使用单位类型 () 表示不返回值。因为不返回值与函数定义相矛盾,从而出现一个错误。在输出中,Rust 提供了一条信息,可能有助于纠正这个错误:它建议删除分号,将会修复这个错误。QLY28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-16759-0.htmlRust编程基础之函数和表达式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: JavaScript设计模式——创建型设计模式

下一篇: JetBrains联合谷歌搞事情!首发稳定版Kotlin跨平台开发框架!

标签:
  • 热门焦点
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页“充值中心”入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
  • 由于成本持续增加,笔记本产品价格预计将明显上涨

    根据知情人士透露,由于材料、物流等成本持续增加,笔记本产品价格预计将在2021年下半年有明显上涨。进入6月下旬以来,全球半导体芯片缺货情况加剧,显卡、处理器
  • 电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
Top