流程控制

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. docker-entrypoint.sh 文件的用处

    参考出处很多著名库的 Dockerfile 文件中,通常都是 ENTRYPOINT 字段会是这样: ENTRYPOINT ["docker-entrypoint.sh"]这里我们参 ...

  2. Qt音视频开发13-视频解码线程基类的设计

    一.前言 这个解码线程基类的设计,是到目前为止个人觉得自己设计的最好的基类之一,当然也不是一开始就知道这样设计,没有个三五年的摸爬滚打以及社会的毒打,是想不到要这样设计的,一方面是要不断提炼各种视频类 ...

  3. java通过apache poi框架读取2007版Excel文件

    java系读写excel文件既可以用jxl库,也可以用POI库,但是,jxl库只支持低版本的excel2003,不支持更高版本,无法直接输出*.xlsx文件,只能输出*.xls文件,另外,更新也不频繁 ...

  4. JMeter JSR223 Sampler 教程:性能测试的魔法棒

    JMeter JSR223 Sampler 教程:性能测试的魔法棒 宝子们,今天咱要深入探索 JMeter 里超厉害的 JSR223 Sampler,它就像是一把万能钥匙,能打开性能测试的各种奇妙大门 ...

  5. 关于vue加element-ui上传文件获取文件的sha256的值 第二篇 更改压缩包编码错误

    这个依然需要插件crypto-js 首先下载引入 import CryptoJs from "crypto-js"; 话不多说直接上代码,首先是element的上传 <el- ...

  6. vue基础2

    1.表单 表单里面有单选框,多选框,下拉框,文本域 vue单页应用 SPA:signal page application(单页应用) 多页面:1个url->1个html文件 多个url-> ...

  7. CDS标准视图:销售变现天数 I_DaysSalesOutstanding

    视图名称:销售变现天数 I_DaysSalesOutstanding 视图类型:参数 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IFIDAYSSLSOUTSTG' ...

  8. Spring-RetryTemplate-RestTemplate的使用

    ------------------------------------------------------------------------------------ 1.基本概念 1.1应用场景 ...

  9. Java集合容器面试题

    Java常用集合类有哪些?Collection接口的子接口包括:Set接口和List接口Map接口的实现类主要有:HashMap.TreeMap.Hashtable.ConcurrentHashMap ...

  10. C#中的内部函数(子函数)

    private bool GetMedicalAdvice(string zyID, out DataTable dtM, out DataTable dtD) { bool result = fal ...