网站开发费税率是多少钱,上海公共招聘网,搜索引擎优化学习,网页编辑公众号3.6.0. 写在正文之前
欢迎来到Rust自学的第三章#xff0c;一共有6个小节#xff0c;分别是:
变量与可变性数据类型#xff1a;标量类型数据类型#xff1a;复合类型函数和注释控制流#xff1a;if else控制流#xff1a;循环#xff08;本文#xff09;
通过第二章…3.6.0. 写在正文之前
欢迎来到Rust自学的第三章一共有6个小节分别是:
变量与可变性数据类型标量类型数据类型复合类型函数和注释控制流if else控制流循环本文
通过第二章的小游戏(没看的初学者强烈建议看一下)相信你已经学会了基本的Rust语法而在第三章我们将更深一层了解Rust中的通用的编程概念。
喜欢的话记得点赞、收藏加关注哦想要跟着学下去记得关注专栏哦
3.6.1. Rust的循环
Rust一共提供了三种循环
loopwhilefor
3.6.2. loop循环
loop关键字告诉Rust要反复执行一段代码除非喊停。以下是一个例子它会不断打印6657 up up!。
fn main(){loop {println!(6657 up up!);}
}可以在loop循环中使用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在每次循环中递增 1。当 counter 等于 10 时break 退出循环同时返回 counter * 2即 20。loop 是一个表达式其返回值是 break 的返回值因此可以直接赋值给 result。result 最终打印出 20。
代码特点
Rust 的 loop 是表达式可以直接绑定结果到变量。break 可以携带返回值这里是 counter * 2并作为 loop 的结果。let 语句要求赋值表达式后需要加分号;因此 loop 的结束大括号 } 后需加分号。
3.6.3. while条件循环
while循环在每次执行循环体之前都要判断一次条件
fn main() {let mut countdown 10; // 倒计时从10开始println!(Rocket Launch Countdown:);while countdown 0 {println!(T-minus {}..., countdown);countdown - 1; // 每次减少1}println!( Liftoff!);println!(Huston, we have a problem.);
}这是一个简单的while循环示例代码其运行结果是:
Rocket Launch Countdown:
T-minus 10...
T-minus 9...
T-minus 8...
T-minus 7...
T-minus 6...
T-minus 5...
T-minus 4...
T-minus 3...
T-minus 2...
T-minus 1...Liftoff!
Huston, we have a problem3.6.4. 使用for循环遍历集合
当然也可以使用while和loop来遍历集合但是易错且低效 这是个使用while的例子
fn main() {let numbers [10, 20, 30, 40, 50];let mut index 0;println!(Using while loop:);while index 5 {println!(Number at index {}: {}, index, numbers[index]);index 1;}
}使用while时极有可能造成索引越界触发panic!而且运行速度较慢因为每次都要检查index 5这个条件。
这是个使用for的例子实现同样的效果:
fn main() {let numbers [10, 20, 30, 40, 50];println!(Using for loop:);for (index, number) in numbers.iter().enumerate() {println!(Number at index {}: {}, index, number);}
}1. numbers.iter()
调用集合 numbers 的 .iter() 方法创建一个不可变的迭代器用于逐个访问集合中的元素。在 Rust 中for 循环并不直接操作集合而是操作实现了 Iterator 特征的迭代器。.iter() 是 Vec或其他集合常用的方法生成一个指向集合元素的引用的迭代器。使用for循环简洁紧凑它可以针对集合中的每个元素来执行代码。由于for循环的安全性、简洁性所以它在Rust中使用最多
2. .enumerate() • 为迭代器的每个元素附加一个索引。索引从 0 开始是一个usize类型的值。.enumerate() 将迭代器的每个元素包装成 (index, value) 的形式其中index 是元素在集合中的索引。value 是当前迭代器指向的元素。.enumerate() 返回一个新的迭代器迭代出的元素类型是 (usize, T)其中 T 是集合中元素的类型。在这里,numbers 是一个Veci32因此T是i32。
3. for (index, number) in ... • for 循环支持解构元组(index, number) 表示我们直接将 enumerate() 提供的 (usize, T)元组解构成两个变量index当前元素的索引。number当前元素的引用不可变。
假设 numbers 是 [10, 20, 30, 40, 50]执行时的过程如下
调用 numbers.iter() 创建迭代器。调用 .enumerate()生成 (索引, 元素引用) 的迭代器for 循环解构出索引和元素 第一次循环index 0, number 10第二次循环index 1, number 20第三次循环index 2, number 30… 打印 index 和 number输出每个元素的索引和值。
由于使用for循环呢的安全、简洁性所以它在Rust里使用最多。
3.6.5. Range
Range由标准库提供。用户可以通过Range生成它们之间的数字不含结束。使用rev方法可以反转Range。
fn main() {println!(Rocket Launch Countdown:);for countdown in (1..10).rev() {println!(T-minus {}..., countdown);}println!( Liftoff!);println!(Huston, we have a problem.);
}这个例子使用for循环、Range和rev实现了上文while函数所实现的火箭倒数
代码解析
(1…10): 这是一个 Range表示从 1 到 10包含 10。… 是包含上限的范围操作符。 .rev(): 反转迭代器生成一个从 10 到 1 的递减序列。