Rust 流程控制

开发中最常见的用来控制执行流的结构是判断和循环。

判断

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

需要注意的是,Rust 是静态语言,因此无法自动将 int 之类的值转换为 bool , 也就是如下的代码会报错:

复制代码
fn main()
{
    let num : i32 = 6
    if num {
        println!("if 内")
    }

}

当然 "num == 6" 这种是允许的;并且如果条件只有一条语句的情况下,是可以不加括号的

Rust 的 if 也支持 else 的分支结构, 并且支持将 if 条件作为表达式使用,也就是 if 可以返回值 ,比如:

另外由于当一个判断有多个分支时,使用 else 会导致代码的杂乱,因此 Rust 提供了一种 match 分支结构,来避免这种问题;

match 是一种极为强大的控制流运算符,它允许开发者将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。模式可由字面值、变量、通配符和许多其他内容构成;match 的力量来源于模式的表现力以及编译器检查,它确保了所有可能的情况都得到处理。

match 的使用方法是match 关键字后跟一个表达式,然后用大括号将要检测的所有值包起来,最后在判断的值之后用 => 运算符将值和匹配成功后将要运行的代码分开,最后在分支代码尾部加一个逗号分隔开,或是直接将整个分支也用大括号包起来。例如可以像这样写:

复制代码
fn main()
{
    let x : i32 = 1;
    match x {
        1 => {
            println!("x = 1")
        }
        2 => println!("x = 2"),
        _ => println!("x = 3"),
    }
}

看到这,第一反应就是这不就是 switch 吗,但其实还是有一些不同:

复制代码
* 在Rust中,match 是一个表达式,也就是它可以返回值。而在其他一些语言中,switch是一个语句,不能返回值。
* Rust 的 match 必须穷尽所有可能的情况,并且提供了 _ 通配符来表示未指定的情况。如果不满足任何一个模式,编译器将会发出警告。
* Rust 的 match 能够处理复杂的模式匹配,例如枚举类型、结构体以及嵌套模式。而其他一些语言中的switch仅能匹配基本数据类型。
* match 在 Rust 中使用 => 来关联模式和执行代码块,而其他语言中通常使用 : 或 -> 。
* Rust 的 match 不需要使用break之类的方式打断,匹配成功之后只会执行匹配到的分支的代码;

总的来说,Rust的match更加强大且安全,因为它是一个表达式,并且需要穷尽所有可能的情况。

这里其实想写个match 结构体的例子的,但是按照C++的方式定义结构体没写出来一堆报错。。。。等后面看到结构体和类再写吧。。。。

循环

Rust 中提供了三种循环关键字: loop while for

for 和 while 应该是绝大多数编程语言都有的关键字,用法也没什么特殊的,就不细述了,看例子就可以了:

loop 关键字会不停的执行代码直到明确要求停止,可以使用 break 关键字来告诉程序何时停止循环,并且 loop 也支持返回表达式,具体看下面的代码:

这段代码,首先在 loop 中不停的对 index 进行单步增长1的操作,然后增长之后判断当前是否已经增长到10,到10 就调用break 退出,同时返回当前值 * 101;

Rust 还有一个特性,如果存在嵌套循环,break 和 continue 只会应用于此时最内层的循环。此时可以选择在一个循环上指定一个 循环标签(loop label),然后将标签与 break 或 continue 一起使用,使这些关键字应用于标记的循环而不是最内层的循环。比如将刚才的代码改一下:

首先给最外层循环定义了一个标签 outloop,然后在内部循环中检测,如果index == 3 就中断内层循环,并返回index*101(这里返回值变量被我删掉了,所以这个返回值其实没有用)。 接下来再检测,如果当前外部循环索引变量到了2,就使用break 中断 outloop 这个循环,至此程序结束。

相关推荐
秦禹辰3 分钟前
宝塔面板安装MySQL数据库并通过内网穿透工具实现公网远程访问
开发语言·后端·golang
黄焖鸡能干四碗9 分钟前
智慧教育,智慧校园,智慧安防学校建设解决方案(PPT+WORD)
java·大数据·开发语言·数据库·人工智能
lypzcgf13 分钟前
Coze源码分析-资源库-删除插件-后端源码-应用和领域服务层
后端·go·coze·coze插件·coze源码分析·智能体平台·ai应用平台
lssjzmn17 分钟前
Spring Web 异步响应实战:从 CompletableFuture 到 ResponseBodyEmitter 的全链路优化
java·前端·后端·springboot·异步·接口优化
shark_chili23 分钟前
程序员必知的底层原理:CPU缓存一致性与MESI协议详解
后端
一只乔哇噻38 分钟前
java后端工程师进修ing(研一版 || day41)
java·开发语言·学习·算法
愿时间能学会宽恕39 分钟前
SpringBoot后端开发常用工具详细介绍——SpringSecurity认证用户保证安全
spring boot·后端·安全
钮钴禄·爱因斯晨1 小时前
深入剖析LLM:从原理到应用与挑战
开发语言·人工智能
CodeSheep1 小时前
稚晖君又开始摇人了,有点猛啊!
前端·后端·程序员
小宁爱Python1 小时前
Django 从环境搭建到第一个项目
后端·python·django