Rust学习笔记_05——控制流(1)

news2024/11/30 9:41:45

Rust学习笔记_02——数组
Rust学习笔记_03——元组
Rust学习笔记_04——引用


Rust学习笔记_05——控制流

控制流(1)

1. if表达式

1.1 基础

在Rust编程语言中,if表达式用于条件判断。它们允许你根据某个条件的真假来执行不同的代码块。Rust的if表达式语法简单但功能强大,支持else ifelse子句,以及嵌套的if表达式。

if condition_1 {
    // 当条件为 true 时执行的代码块
} else if condition_2 {
    // 当condition_2 为 true 时执行的代码块
} else {
 	// 其他情况   
}

示例

fn main() {
    let number = 7;

    if number > 10 {
        println!("The number is greater than ten.");
    } else if number == 10 {
        println!("The number is ten.");
    } else if number < 10 && number > 5 {
        println!("The number is between five and ten.");
    } else {
        println!("The number is five or less.");
    }
}
1.2 表达式返回值

Rust中的if表达式是有返回值的,这意味着你可以将if表达式的结果赋值给变量

fn main() {
    let number = 10;

    let message = if number > 10 {
        "The number is greater than ten."
    } else if number == 10 {
        "The number is ten."
    } else {
        "The number is less than ten."
    };

    println!("{}", message);
}

1.3 嵌套的if表达式

fn main() {
    let number = 7;
    let is_positive = number > 0;

    if is_positive {
        if number > 5 {
            println!("The number is positive and greater than five.");
        } else {
            println!("The number is positive but less than or equal to five.");
        }
    } else {
        println!("The number is not positive.");
    }
}
1.4 注意事项
  1. 条件必须是布尔类型if表达式中的条件必须是布尔类型(bool)。如果条件不是布尔类型,Rust编译器会报错。

  2. 代码块是必需的:与某些其他语言不同,Rust中的if表达式的大括号{}是必需的,即使代码块中只有一条语句。

2. Loop循环

2.1 基础

在Rust编程语言中,loop循环是一种基础且强大的控制流结构,它允许你创建一个无限循环,直到你在循环体内显式地使用break语句来退出。这种灵活性使得loop循环在处理不确定次数的迭代或需要等待某个条件成立时特别有用。

loop {
    // 循环体内的代码
    // 当需要退出循环时,使用 break 语句
}

示例

fn main() {
    let mut counter = 0;

    loop {
        println!("Counter is now: {}", counter);

        counter += 1;

        // 当计数器达到5时,退出循环
        if counter >= 5 {
            break;
        }
    }

    println!("Loop has ended.");
}
2.2 break 语句

loop循环中,break语句用于立即退出循环。它还可以选择性地返回一个值,这个值可以被赋值给循环外部的变量

fn main() {
    let result = loop {
        // ... 一些计算或逻辑处理 ...

        // 假设在某个条件下,我们想要退出循环并返回一个值
        if /* 某个条件 */ {
            break 42; // 退出循环并返回42
        }
    };

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

示例

fn main() {
    // 声明一个变量来存储从loop中返回的值
    let result: Option<i32> = loop {
        // 模拟一些计算或逻辑处理
        println!("Searching for a number...");

        // 假设我们有一个条件,当满足时,我们想退出循环并返回一个值
        let number = get_random_number(); // 这是一个假设的函数,用于获取随机数

        // 检查这个数是否是我们想要的(比如,我们想要找到数字42)
        if number == 42 {
            // 当找到数字42时,退出循环并返回Some(42)
            break Some(42);
        }

        // 如果没有找到,继续循环(这里可以添加一些延迟或其他逻辑)
    };

    // 处理从loop中返回的结果
    match result {
        Some(value) => println!("Found the number: {}", value),
        None => println!("Did not find the number we were looking for."),
    }
}

// 这是一个假设的函数,用于模拟获取随机数
fn get_random_number() -> i32 {
    // 在实际代码中,这里会使用随机数生成器
    // 但为了示例,我们简单地返回一个递增的数字
    static MUT_COUNTER: std::sync::Mutex<i32> = std::sync::Mutex::new(0);
    let mut counter = MUT_COUNTER.lock().unwrap();
    *counter += 1;
    *counter
}
2.4 嵌套loop

你可以在loop循环内部再嵌套一个或多个loop循环,以处理更复杂的逻辑。嵌套循环的退出方式与单层循环相同,都是使用break语句。不过,在嵌套循环中,你可以通过标签(labels)来区分不同层级的breakcontinue语句(尽管Rust的loopwhilefor循环本身不支持标签,但你可以通过其他方式如闭包或额外的变量来模拟这种行为)。

示例

fn main() {
    // 外部循环的控制变量
    let mut outer_loop_should_continue = true;

    // 外部loop循环
    loop {
        // 检查外部循环是否应该继续
        if !outer_loop_should_continue {
            break; // 退出外部循环
        }

        println!("Outer loop iteration");

        // 内部循环的控制变量
        let mut inner_loop_found = false;

        // 内部loop循环
        loop {
            println!("  Inner loop iteration");

            // 模拟一些条件检查
            let some_condition = check_some_condition(); // 假设的函数

            // 如果满足某个条件,想要退出内部循环并可能影响外部循环
            if some_condition {
                inner_loop_found = true; // 标记内部循环找到了条件
                break; // 退出内部循环
            }

            // 如果满足某个条件,想要同时退出外部和内部循环
            if should_exit_both_loops() {
                outer_loop_should_continue = false; // 标记外部循环应该停止
                break; // 由于是在内部循环中,这只会退出内部循环
                // 但由于外部循环的检查,它也会在下次迭代时退出
            }

            // 其他逻辑...
        }

        // 检查内部循环是否找到了我们想要的条件
        if inner_loop_found {
            // 根据内部循环的结果做进一步处理
            println!("Condition found in inner loop, processing...");

            // 如果需要,可以在这里设置条件来退出外部循环
            // outer_loop_should_continue = false; // 已经在某个条件中设置过了,这里可以省略
        } else {
            // 如果没有找到条件,可能需要做其他处理或继续外部循环
            println!("No condition found in inner loop, continuing outer loop...");

            // 可以根据需要添加其他逻辑来决定是否继续外部循环
            // 比如,可以设置一个计数器来限制外部循环的次数
        }

        // 在实际应用中,可能还有其他逻辑来决定是否继续外部循环
        // 这里为了示例简单,没有添加额外的条件检查
    }

    println!("All loops have ended.");
}

// 假设的函数,用于模拟条件检查
fn check_some_condition() -> bool {
    // 在实际代码中,这里会包含一些逻辑来检查条件
    // 为了示例,我们简单地返回一个交替的布尔值(模拟找到条件的概率)
    static MUT_COUNTER: std::sync::Mutex<i32> = std::sync::Mutex::new(0);
    let mut counter = MUT_COUNTER.lock().unwrap();
    *counter += 1;
    *counter % 2 == 0
}

// 假设的函数,用于模拟是否应该同时退出两个循环的条件
fn should_exit_both_loops() -> bool {
    // 在实际代码中,这里会包含一些逻辑来检查是否满足退出两个循环的条件
    // 为了示例,我们简单地返回false(不退出两个循环),或者可以根据需要修改
    false
}

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

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

相关文章

HTTP(网络)

目录 1.Http的基本代码 1.1 HttpServer.hpp 1.2 简单测试一下 1.3 用telnet测试一下 1.4 用浏览器访问 1.5 返回相应的过程&#xff08;网页版本&#xff09;​编辑 1.5.1 再次用浏览器访问 1.6 返回相应的过程&#xff08;文件版本&#xff09; 1.6.1网页 1.6.2 测试 …

docker服务容器化

docker服务容器化 1 引言2 多个容器间网络联通2.1 单独创建关联2.2 创建时关联 3 服务搭建3.1 镜像清单3.2 容器创建 4 联合实战4.2 flink_sql之kafka到starrocks4.2 flink_sql之mysql到starrocks 5 文献借鉴 1 引言 ​ 利用docker可以很效率地搭建服务&#xff0c;本文在win1…

Linux系统之iotop命令的基本使用

Linux系统之iotop命令的基本使用 一、iotop命令介绍二、iotop命令的使用帮助2.1 安装iotop2.2 iotop命令help帮助信息2.3 iotop命令选项解释 三、 iotop命令的基本使用四、iotop使用注意事项 一、iotop命令介绍 iotop 是一个类似于 top 的命令行工具&#xff0c;但它专注于显示…

opencv 区域提取三种算法

opencv 区域提取三种算法 1.轮廓查找 findContours()函数&#xff0c;得到轮廓的点集集合 cv::vector<cv::vector<Point>> contours;threshold(roiMat,binImg,m_pPara.m_nMinGray,m_pPara.m_nMaxGray,THRESH_BINARY);//膨胀处理Mat dilaElement getStructuringE…

【深度学习】—CNN卷积神经网络 从原理到实现

卷积神经网络&#xff08;CNN&#xff09;从原理到实现 什么是卷积神经网络&#xff08;CNN&#xff09;&#xff1f; 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种深度学习模型&#xff0c;主要应用于图像分类、目标检测和自然语言处理等领…

A-star算法

算法简介 A*&#xff08;A-star&#xff09;算法是一种用于图形搜索和路径规划的启发式搜索算法&#xff0c;它结合了最佳优先搜索&#xff08;Best-First Search&#xff09;和Dijkstra算法的思想&#xff0c;能够有效地寻找从起点到目标点的最短路径。A*算法广泛应用于导航、…

【数据集划分】训练集train/验证集val/测试集test是如何划分的?

&#x1f680;在跑代码时常常将数据集简单的划分为训练集train和测试集test(二划分)&#xff0c;其实更为全面完整的划分应该是划分为训练集train、验证集val、测试集test(三划分)。那么具体如何划分呢&#xff1f;各个部分起着什么作用呢&#xff1f; 如下图所示&#xff0c;…

Gentoo Linux部署LNMP

一、安装nginx 1.gentoo-chxf ~ # emerge -av nginx 提示配置文件需更新 2.gentoo-chxf ~ # etc-update 3.gentoo-chxf ~ # emerge -av nginx 4.查看并启动nginx gentoo-chxf ~ # systemctl status nginx gentoo-chxf ~ # systemctl start nginx gentoo-chxf ~ # syst…

Ubantu系统非root用户安装docker教程

非root用户没有超级权限&#xff0c;根据docker安装教程安装完毕会发现无法拉取镜像&#xff0c;或者每次运行docker都需要加上sudo&#xff0c;输入密码验证。 解决办法如下&#xff1a; 1、创建docker用户组 sudo groupadd docker2、将非root用户&#xff08;当前用户&am…

python可视化高纬度特征

可视化网络的特征层&#xff0c;假如resnet网络输出的特征维度是(batch_size,512). 如果要可视化测试集的每个图片的512高维度特征分布呢&#xff1f; embeds resnet18(x)&#xff0c;embeds是(batch_size,512)高维度特征。如下可视化。 import torch import matplotlib.pyp…

OceanBase 大数据量导入(obloader)

现需要将源数据库&#xff08;Oracle|MySQL等&#xff09;一些表的海量数据迁移到目标数据库 OceanBase 中&#xff0c;基于常规 jdbc 驱动编码的方式涉及开发工作&#xff0c;性能效率也要看编码的处理机制。 OceanBase 官方提供了的 OceanBase Migration Service (OMS) 数据…

Mac启动服务慢问题解决,InetAddress.getLocalHost().getHostAddress()慢问题。

项目启动5分钟&#xff0c;很明显有问题。像网上其他的提高jvm参数就不说了&#xff0c;应该不是这个问题&#xff0c;也就快一点。 首先找到自己的电脑名称&#xff08;用命令行也行&#xff0c;只要能找到自己电脑名称就行&#xff0c;这里直接在共享里看&#xff09;。 复制…

Ubuntu交叉编译 opencv for QNX

前言 在高通板子上开发一些程序的时候,会用到opencv帮助处理一下图像数据,高通车载板子sa8155和sm8295都有QNX os,需要交叉编译opencv的库,(这个交叉编译真是搞得我太恶心了,所以进行一个记录和分享) 搜了很多资料,有些太过于复杂,有些也存在错误导致最后没有编译成…

.NET 9 AOT的突破 - 支持老旧Win7与XP环境

引言 随着技术的不断进步&#xff0c;微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中&#xff0c;一个特别引人注目的亮点是 AOT&#xff08; Ahead-of-Time&#xff09;支持&#xff0c;它允许开发人员将应用程序在编译阶段就优化为能够在老旧的 Win…

Mac 环境下类Xshell 的客户端介绍

在 Mac 环境下&#xff0c;类似于 Windows 环境中 Xshell 用于访问 Linux 服务器的工具主要有以下几种&#xff1a; SecureCRT&#xff1a; 官网地址&#xff1a;https://www.vandyke.com/products/securecrt/介绍&#xff1a;支持多种协议&#xff0c;如 SSH1、SSH2、Telnet 等…

Cookie跨域

跨域&#xff1a;跨域名&#xff08;IP&#xff09; 跨域的目的是共享Cookie。 session操作http协议&#xff0c;每次既要request&#xff0c;也要response&#xff0c;cookie在创建的时候会产生一个字符串然后随着response返回。 全网站的各个页面都会带着登陆的时候的cookie …

虚拟机CentOS系统通过Docker部署RSSHub并映射到主机

公告 &#x1f4cc;更新公告 20241124-该文章已同步更新到作者的个人博客&#xff08;链接&#xff1a;虚拟机CentOS系统通过Docker部署RSSHub并映射到主机&#xff09; 一、编辑 YUM 配置文件 1、打开 CentOS 系统中的 YUM 软件仓库配置文件 vim /etc/yum.repos.d/CentOS-Ba…

DreamCamera2相机预览变形的处理

最近遇到一个问题&#xff0c;相机更换了摄像头后&#xff0c;发现人像角度顺时针旋转了90度&#xff0c;待人像角度正常后&#xff0c;发现 预览时图像有挤压变形&#xff0c;最终解决。在此记录 一人像角度的修改 先放示意图 设备预览人像角度如图1所示&#xff0c;顺时针旋…

Taro React小程序开发框架 总结

目录 一、安装 二、目录结构 三、创建一个自定义页面 四、路由 1、API 2、传参 3、获取路由参数 4、设置TabBar 五、组件 六、API Taro非常好用的小程序框架&#xff0c;React开发者无缝衔接上。 一、安装 官方文档&#xff1a;Taro 文档 注意&#xff0c;项目创建…

RPA:电商订单处理自动化

哈喽&#xff0c;大家好&#xff0c;我是若木&#xff0c;最近闲暇时间较多&#xff0c;于是便跟着教程做了一个及RPA&#xff0c;谈到这个&#xff0c;可能很多人并不是很了解&#xff0c;但是实际上&#xff0c;这玩意却遍布文末生活的边边角角。话不多说&#xff0c;我直接上…