流程控制

if

    if n < 0 {
print!("{} is negative", n);
} else if n > 0 {
print!("{} is positive", n);
} else {
print!("{} is zero", n);
}

if 语句也可以作为变量计算的代码块

    let big_n =
if n < 10 && n > -10 {
println!(", and is a small number, increase ten-fold"); // 这个表达式返回一个 `i32` 类型。
10 * n
} else {
println!(", and is a big number, half the number"); // 这个表达式也必须返回一个 `i32` 类型。
n / 2
// 试一试 ^ 试着加上一个分号来结束这条表达式。
};
// ^ 不要忘记在这里加上一个分号!所有的 `let` 绑定都需要它。

loop

    // 无限循环
loop {
count += 1; if count == 3 {
println!("three"); // 跳过这次迭代的剩下内容
continue;
} println!("{}", count); if count == 5 {
println!("OK, that's enough"); // 退出循环
break;
}
}

默认是无线循环, 需要手动break

嵌套loop

loop可以嵌套, 在嵌套的时候可以给每个loop打上对应的标签

标签可以用来识别是哪个loop, 这可以帮助 break 和 continue

#![allow(unreachable_code)]

fn main() {
'outer: loop {
println!("Entered the outer loop"); 'inner: loop {
println!("Entered the inner loop"); // 这只是中断内部的循环
//break; // 这会中断外层循环
break 'outer;
} println!("This point will never be reached");
} println!("Exited the outer loop");
}

break返回值

在loop中可以使用break返回值

fn main() {
let mut counter = 0; let result = loop {
counter += 1; if counter == 10 {
break counter * 2;
}
}; assert_eq!(result, 20);
}

while

一个带上条件的循环, 写作为 while n < 101 {

for

    // `n` 将在每次迭代中分别取 1, 2, ..., 100
for n in 1..101 {

不包含101

for n in 1..=100 {

包含100

迭代器

可以和迭代器进行操作

使用iter和iter_mut函数, 采用借用的方式

fn main() {
let names = vec!["Bob", "Frank", "Ferris"]; for name in names.iter() {
match name {
&"Ferris" => println!("There is a rustacean among us!"),
_ => println!("Hello {}", name),
}
}
}
  • into_iter 函数会消耗元素, 这不是借用, 用了之后就丢失了

match

匹配变量的情况选择对应的分支

这个代码可以用来作为处理异常的情况

    let num = 13;
print!("{} 是", num);
match num % 2 {
0 => {
println!("偶数")
}
1 => println!("奇数"),
_ => println!("未知"),
}

使用 | 作为或者操作符

使用 _ 用来处理其他情况

可以使用范围操作符

变量赋值

    let binary = match boolean {
// match 分支必须覆盖所有可能的值
false => 0,
true => 1,
// 试一试 ^ 将其中一条分支注释掉
};

可以用来快速赋值

解构

    let triple = (0, -2, 3);
// 试一试 ^ 将不同的值赋给 `triple` println!("Tell me about {:?}", triple);
// match 可以解构一个元组
match triple {
// 解构出第二个和第三个元素
(0, y, z) => println!("First is `0`, `y` is {:?}, and `z` is {:?}", y, z),
(1, ..) => println!("First is `1` and the rest doesn't matter"),
// `..` 可用来忽略元组的其余部分
_ => println!("It doesn't matter what they are"),
// `_` 表示不将值绑定到变量
}

因为元组被解构之后可以作为匹配的条件

enum

可以用来操作枚举类, 比如处理异常

枚举类内部是可以携带值的

引用

    match reference {
// 如果用 `&val` 这个模式去匹配 `reference`,就相当于做这样的比较:
// `&i32`(译注:即 `reference` 的类型)
// `&val`(译注:即用于匹配的模式)
// ^ 我们看到,如果去掉匹配的 `&`,`i32` 应当赋给 `val`。
// 译注:因此可用 `val` 表示被 `reference` 引用的值 4。
&val => println!("Got a value via destructuring: {:?}", val),
}

guard

fn main() {
let pair = (2, -2);
// 试一试 ^ 将不同的值赋给 `pair` println!("Tell me about {:?}", pair);
match pair {
(x, y) if x == y => println!("These are twins"),
// ^ `if` 条件部分是一个卫语句
(x, y) if x + y == 0 => println!("Antimatter, kaboom!"),
(x, _) if x % 2 == 1 => println!("The first one is odd"),
_ => println!("No correlation..."),
}
}

可以使用 if 语句帮助进行条件选择

other

有一些类似 if letwhile let 的运算符不赘述, 为了减少嵌套和使得代码更加美观的操作不是必须的

rust学习笔记(4)的更多相关文章

  1. Rust学习笔记1

    这是一份不错的rust教程,目前包括4个block和4个project.全部完成后可以用rust实现一个简单的key-value存储引擎. 注意:Windows下rust貌似会遇到一些bug,强烈建议 ...

  2. Rust学习笔记一 数据类型

    写在前面 我也不是什么特别厉害的大牛,学历也很低,只是对一些新语言比较感兴趣,接触过的语言不算多也不算少,大部分也都浅尝辄止,所以理解上可能会有一些偏差. 自学了Java.Kotlin.Python. ...

  3. Rust学习笔记2

    继续继续... 转眼都开学啦... Building Blocks 2 building blocks里讲了一些关于Log structure storage的东西,这也是用于在硬盘上持久化KvSto ...

  4. Rust学习之旅(读书笔记):枚举 (Enum)

    Rust学习之旅(读书笔记):枚举 (Enum) C 语言的枚举类型很弱,不如后来的语言,也不如之前的语言.在 C 语言里面枚举量就是一个名字,更方便的定义常量.今天读了<The Rust Pr ...

  5. 《Rust权威指南》学习笔记——4. 认识所有权

    Rust权威指南学习笔记--认识所有权 什么是所有权 1. 所有权规则 Rust中的每一个值都有一个对应的变量作为它的所有者. 在同一时间内,值有且仅有一个所有者. 当所有者离开自己的作用域时,它持有 ...

  6. Rust 学习之旅(7):Package,Crate,Module

    Rust 学习之旅(7):Package,Crate,Module 这是第 7 章的读书笔记,Cargo Workspace 在第 14 章. Packages and Crates As a pro ...

  7. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  8. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  9. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  10. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

随机推荐

  1. Qt血的教训/细数Qt开发的各种坑/又爱又恨/欢迎围观留言评论

    一.吐槽总结 搞Qt开发十几年了,最初从Qt4.6开始,一直追新到现在的6.7版本,中间经历过无数的血的教训,简直是又爱又恨.其实Qt挺好的,但是还是要忍不住吐槽一下,本人还是希望Qt发展的越来越好, ...

  2. .NET Bioss相关数据读写

    本文我们介绍针对Bios如何读取.写入数据,比如最常见的SN读取以及烧录 WMI查询 先看看WMI方式,可以用于查询和管理Windows系统的各种信息,包括读取BIOS信息 WMI-Win32_BIO ...

  3. MySQL数据库建库时SQL语句中数据库名、表名用引号的问题以及COLLATE utf8_general_ci的含义

    一.MySQL数据库建库时SQL语句中数据库名.表名用引号的问题解释:在创建MySQL数据库和表时,数据库名.表名和字段名外面的符号 ` 不是单引号,而是英文输入法的反单引号,同键盘~同一位置.为了避 ...

  4. 移动端弱网优化专题(十四):携程APP移动网络优化实践(弱网识别篇)

    本文由携程技术团队Aaron分享,原题"干货 | 携程弱网识别技术探索",下文进行了排版和内容优化. 1.引言 网络优化一直是移动互联网时代的热议话题,弱网识别作为移动端弱网优化的 ...

  5. WxPython跨平台开发框架之图标选择界面

    在使用 wxPython 开发跨平台桌面应用程序时,创建一个图标选择界面通常用于让用户从图标资源库中选择图标,我们可以把图标分为自定义的图标资源和系统的图标资源两大类,最终我们把它们整合一起使用,在框 ...

  6. Tortoisegit提交代码步骤总结

    Tortoisegit提交代码步骤总结 与SVN不同,git提交代码是首先提交(commit)到本地仓库,然后再推送(Push)到远程仓库. 1.在本地代码库的文件夹中,"右键", ...

  7. java注释转json插件开发实战

    目的 将java的代码注释转换为json格式,并写入文件 本文介绍了完整的开发流程及如何使用 运行环境 jdk1.8 maven3.x 设计思想 系统构思 编译完成的class里没有注释的,所以注释信 ...

  8. [译] WinForms:分析一下(我用 Visual Basic 写的)

    原文 | Klaus Loeffelmann 翻译 | 郑子铭 如果您从未看过电影<分析这一点>,下面是简短的介绍:假设一个纽约家族的成员有可疑的习惯,他决定认真考虑接受治疗以改善他的精神 ...

  9. 手把手教你部署 DeepSeek 本地模型

    本文目标:部署 DeepSeek 本地模型,并通过 Ollama 提供 API 支持,Chatbox 提供 UI 界面. 原则:不搞那些高深的玩法,让小白也能理解并真正的上手实践. 1.下载Ollam ...

  10. Python pika消费Rabbit MQ数据,慢消费引起的connection reset问题

    问题描述 使用python pika框架,从Rabbit MQ消费数据时,遇到了connection reset的错误,错误内容如下: Traceback (most recent call last ...