Rust - 流程控制

Rust 程序是从上而下顺序执行的,在此过程中,我们可以通过循环、分支等流程控制方式,更好的实现相应的功能。

根据条件是否为真来决定是否执行某些代码,以及根据条件是否为真来重复运行一段代码的能力是大部分编程语言的基本组成部分。Rust 代码中最常见的用来控制程序进行条件执行结构的是 if 表达式和循环。

(一)if表达式

if 表达式允许根据条件执行不同的代码分支。你提供一个条件并表示“如果条件满足,运行这段代码;如果条件不满足,不运行这段代码。”

当然,也可以包含一个可选的 else 表达式来提供一个在条件不满足时需要执行的代码块,如果不提供 else 表达式,那么在条件不满足时,程序则会直接忽略 if 代码块并继续向下执行。

fn main() {
    let number = 3;

    if number < 5 {
        println!("condition was true");
    } else {
        println!("condition was false");
    }
}

值得注意的是,代码中的条件 必须 是 bool 值。如果条件不是 bool 值,程序就会错误。

例如以下代码,类似的写法可能在别的编程语言中可以顺利执行,但Rust却会报错:

fn main() {
    let number = 3;
    if number {
        println!("number was three");
    }
}

//编译结果:期待的是一个布尔值,但现在却是个数值。
//if number {
//   ^^^^^^ expected `bool`, found integer

可以很明显看出,Rust 并不会自动地将非布尔值转换为布尔值,必须总是显式地使用布尔值作为 if 的条件。
如果想要 if 代码块只在一个数字不等于 0 时执行,可以把 if 表达式修改成下面这样:

fn main() {
    let number = 3;

    if number != 0 {
        println!("number was something other than zero");
    }
}

如果想要 if 代码块只在一个数字只等于 0 时执行,可以把 if 表达式修改成下面这样:

fn main() {
    let number = 3;

    if number == 0 {
        println!("number was something other than zero");
    }
}

(二)使用else if处理多重条件

可以将 else if 与 if、else 组合在一起实现更复杂的条件分支判断:

fn main() {
    let n = 6;

    if n % 4 == 0 {
        println!("number is divisible by 4");
    } else if n % 3 == 0 {
        println!("number is divisible by 3");
    } else if n % 2 == 0 {
        println!("number is divisible by 2");
    } else {
        println!("number is not divisible by 4, 3, or 2");
    }
}

程序执行时,会按照自上至下的顺序执行每一个分支判断,一旦成功,则跳出 if 语句块,最终本程序会匹配执行 else if n % 3 == 0 的分支,输出 “number is divisible by 3”。

有一点要注意,就算有多个分支能匹配,也只有从上至下第一个被匹配到的分支会被执行!

(三)在let语句中使用if

因为 if 是一个表达式,所以我们可以在 let 语句的右侧使用它:

fn main() {
    let condition = true;
    let number = if condition {
        5
    } else {
        6
    };

    println!("The value of number is: {}", number);
}
//运行结果:The value of number is: 5

在上面的例子中,number 变量将会绑定到表示 if 表达式结果的值上。

以上代码有以下几点要注意:

  1. if 语句块是表达式,这里我们使用 if 表达式的返回值来给 number 进行赋值:number 的值是 5。
    1. 记住:代码块的值是其最后一个表达式的值,而数字本身就是一个表达式。在这个例子中,整个 if 表达式的值取决于哪个代码块被执行。
  2. 用 if 来赋值时,要保证每个分支返回的类型一样,此处返回的 5 和 6 就是同一个类型,如果返回类型不一致就会报错。
    1. 例如:if 代码块中的表达式返回一个整数,而 else 代码块中的表达式返回一个字符串。这不可行,因为变量必须只有一个类型。Rust 需要在编译时就确切的知道 number 变量的类型,这样它就可以在编译时验证在每处使用的 number 变量的类型是有效的。

(四)loop循环

Rust中一共有三种循环,分别是loop、while、for。
loop关键字告诉Rust要反复的执行一块代码,直到我们自己明确要求停止才结束。

fn main() {
    loop {
        println!("again!");
    }
}
//无限打印again

想要让程序停止循环,我们通过在loop循环中使用break关键字来实现:

(break关键字在任何一种循环中都能用)

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {result}");
}

在循环之前,我们声明了一个名为 counter 的变量并初始化为 0。接着声明了一个 result 来存放循环的返回值。

在循环的每一次迭代中,我们将 counter 变量加 1,接着检查计数是否等于 10。当计数恰好为10时,使用 break 关键字返回 counter * 2 的值。(如果没有需要返回的值,直接就写成“ break; ”,结束loop循环。)

循环之后,我们通过分号结束赋值给 result 的语句(第10行)。最后打印出 result 的值,也就是 20。

(五)while条件循环

还有一种比较常见的循环模式是每次执行循环体之前都判断一次条件,再决定循环是否继续执行。

while条件循环就是为这种模式而生。

fn main() {
    let mut number = 3;

    //程序循环三次,每次数字都减一。
    while number != 0 {
        println!("{number}!");

        number -= 1;
    }
    
    //接着,在循环结束后,打印出另一个信息并退出。
    println!("LIFTOFF!!!");
}
/*
执行结果:
3
2
1
LIFTOFF!!!
*/

(六)for循环

for 循环是 Rust 中经常使用到的一种循环模式,不同于loop和while,它的功能不仅仅是“循环执行xx”这么简单,更重要的是它自身带来的“遍历”能力。

fn main() {
    for i in 1..=5 {
        println!("{}", i);
    }
}
/*
执行结果:
1
2
3
4
5
*/

以上代码循环输出了一个从 1 到 5 的序列,简单粗暴,核心就在于 for 和 in 的联动,语义表达如下:

for 元素 in 集合 {
  // 使用元素干一些你懂我不懂的事情
}

这个语法跟 JavaScript 还蛮像,应该挺好理解。

注意代码中的“1…=5”表示一个range范围,意为“1≥x≤5”。
而若修改为“1…5”,则意为“1≥x<5”。

使用for遍历集合:

fn main() {
    let a = [10, 20, 30, 40, 50];

    for element in a {
        println!("the value is: {element}");
    }
}
/*
执行结果:
the value is: 10
the value is: 20
the value is: 30
the value is: 40
the value is: 50
*/

当然,还有一个关于 **continue **关键字的知识点:
使用 continue 可以跳过当前当次的循环,开始下次的循环:

 for i in 1..4 {
     if i == 2 {
         continue;
     }
     println!("{}", i);
 }
//上面代码对 1 到 3 的序列进行迭代,且跳过值为 2 时的循环,输出如下:
//1
//3

同样的,continue 和 break 关键字一样,在任何一种循环中都能用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言【指针】

1. 基本语法 1.1 指针变量的定义和使用(重点) 指针是一种数据类型&#xff0c;指针变量指向谁 就把谁的地址赋值给指针变量 1.2 通过指针间接修改变量的值 指针变量指向谁 就把谁的地址赋值给指针变量 可以通过 *指针变量 间接修改变量的值 1.3 const修饰的指针变量 语法…

C语言 【函数】

1.函数概述 函数是一种可重用的代码块&#xff0c;用于执行特定任务或完成特定功能 函数作用&#xff1a;对具备相同逻辑的代码进行封装&#xff0c;提高代码的编写效率&#xff0c;实现对代码的重用 2. 函数的使用 2.1 无参无返回值 #include <stdio.h>// 函数名…

【AAAI2024】点云的自适应邻域提取

论文标题&#xff1a;Point Deformable Network with Enhanced Normal Embedding for Point Cloud Analysis 论文地址&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/28497 两个创新点&#xff1a;可变邻域法向量提取 一、由固定邻居变为可变的邻域 二、最小二…

让一个元素在网页上跟随网页窗口大小变化始终保持上下左右居中

废话少说&#xff0c;直接上代码&#xff0c;懂的都懂&#xff1a; <!DOCTYPE html> <html style"font-size: 100px;"> <head><meta http-equiv"Content-Type" content"text/html;charsetUTF-8"><style type"te…

搭建第一个Web服务器(在eclipse或idea上部署Tomcat服务器)

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

开关电源测试流程有哪些?如何让测试更简单?

NSAT-8000电源综合测试系统适用于AC-DC、DC-DC电源模块的研发和产线测试&#xff0c;为电源模块测试提供自动化测试方案。用该系统测试开关电源&#xff0c;只需以下操作即可完成&#xff1a; 1. 登录测试系统 2. 在方案运行界面找到已搭建好的开关电源测试方案&#xff0c;点击…

Learn SRP 02

3.Editor Rendering 3.1Drawing Legacy Shaders 因为我们的管线只支持无光照的着色过程&#xff0c;使用其他不同的着色过程的对象是不能被渲染的&#xff0c;他们被标记为不可见。尽管这是正确的&#xff0c;但是它还是隐藏了场景中一些使用错误着色器的对象。所以让我们来渲…

java -spring 图灵 03 各种核心组件

01.BeanDefinition 表示Bean定义&#xff0c;BeanDefinition中存在很多属性用来描述一个Bean的特点。比如&#xff1a; class&#xff0c;表示Bean类型 scope&#xff0c;表示Bean作用域&#xff0c;单例或原型等 lazyInit&#xff1a;表示Bean是否是懒加载 initMethodName&am…

postman 调试 传base64字符串 原来选xml

上个图 工具类 package org.springblade.common.utils;import com.alibaba.fastjson.JSONObject; import org.springblade.modules.tc.mas.Submit;import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStrea…

用示例说明序列化和反序列化

用示例说明序列化和反序列化 序列化和反序列化是将数据结构或对象转换为可存储或传输的格式&#xff0c;以便在需要时重新构建原始数据结构或对象的过程。常见的序列化格式包括 JSON、XML 和 Pickle。 序列化&#xff08;Serialization&#xff09;&#xff1a; 在计算机科学…

嵌入式中C++指针使用方法总结

各位开发者大家好,在分享指针之前,先来看一下int *p[3]和int (*p)[3] 的区别。 int *p[3] p是一个数组,此数组有3个元素,每个元素都是int*类型,也就是指向整型数据的指针类型。 int a=10,b=20,c=30; int*p[3]={&a,&b,&c}; 而int(*p)[3]中的p是一个指向数组的…

吐槽一下腾讯云TKE原生节点的降本增效

背景 作为一个10年腾讯云用户我本来是不想吐槽的&#xff0c;往常有问题都是第一时间在用户反馈群里面吐槽一下&#xff0c;这次我是忍不了吐槽了起因就是下面这种图&#xff1a; 恩 tke节点的新建&#xff0c;现在默认首个是原生节点&#xff0c;对没有看错&#xff0c;可以…

操作系统安全

操作系统属于软件安全的范畴。 什么是操作系统&#xff1f; 操作系统是硬件和软件应用程序之间接口的程序模块&#xff0c;是计算机资源的管理者。操作系统是保证安全的重要基础。 一、操作系统安全基础 操作系统保护的对象 操作系统的安全功能 用户认证存储器保护文件与I/O设…

初始监控工具--zabbix和安装

一、Zabbix 1. 监控系统的必要性 作为一个技术人员&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果和网站的健康状态。 2. 监控软件的作用 利用一个优秀的监控软件&#xff0c;我们可以: ● 通过一个友…

蚂蚁摩斯入选IDC《数据要素全景研究》报告

近日&#xff0c;全球权威研究机构IDC发布《数据要素全景研究》&#xff0c;对当前数据要素市场的主要需求、市场活动参与主体、落地形式等情况进行分析并列举了市场代表性的技术架构及应用案例为产品选型提供参考。蚂蚁数科以技术服务完整性入选代表技术厂商&#xff0c;旗下摩…

DNS服务器配置与管理(3)——综合案例

DNS服务器配置与管理 前言 在之前&#xff0c;曾详细介绍了DNS服务器原理和使用BIND部署DNS服务器&#xff0c;本文主要以一个案例为驱动&#xff0c;在网络中部署主DNS服务器、辅助DNS服务器以及子域委派的配置。 案例需求 某公司申请了域名example.com&#xff0c;公司服…

【YOLOv8改进[损失函数]】使用结合InnerIoU和Focaler的各种损失函数助力YOLOv8更优秀

目录 一 回归损失函数&#xff08;Bounding Box Regression Loss&#xff09; 1 Inner-IoU 2 Focaler-IoU&#xff1a;更聚焦的IoU损失 二 改进YOLOv8的损失函数 1 总体修改 ① ultralytics/utils/metrics.py文件 ② ultralytics/utils/loss.py文件 ③ ultralytics/uti…

服务器中毒怎么办?企业数据安全需重视

互联网企业&#xff1a; 广义的互联网企业是指以计算机网络技术为基础&#xff0c;利用网络平台提供服务并因此获得收入的企业。广义的互联网企业可以分为:基础层互联网企业、服务层互联网企业、终端层互联网企业。 狭义的互联网企业是指在互联网上注册域名&#xff0c;建立网…

11.基础乐理-音域、1=C到底是那一组的C

音域&#xff1a; 音域它指的是一个乐器&#xff08;包括人声&#xff09;&#xff0c;能发出的所有的音高总&#xff0c;比如我们拿钢琴来看&#xff0c;钢琴最低的是大字二组的A2&#xff0c; 钢琴最高音是小字五组的c5&#xff0c;钢琴的音域是A2 - c5&#xff0c;如图1所示…

数字次数排序-第12届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第53讲。 数字次数排序&…
最新文章