Rust学习笔记_03——元组
Rust学习笔记_04——引用
Rust学习笔记_05——控制流(1)
Rust学习笔记_06——控制流(2)
控制流(2)
1. While循环
1.1 基础
Rust编程语言中,while
循环是一种基本的控制流结构,它允许程序在给定条件为真时重复执行一段代码块。
while condition {
// 循环体:当condition为true时,重复执行的代码块
}
condition
是一个表达式,它必须返回一个实现了std::convert::Into<bool>
的类型的值(通常直接就是一个布尔值bool
)。在每次循环迭代之前,都会计算这个条件。- 如果条件为
true
,则执行大括号{}
中的代码块。 - 执行完代码块后,再次计算条件。
- 如果条件仍为
true
,则重复执行代码块。 - 这个过程会一直持续,直到条件变为
false
,此时循环结束,程序继续执行while
循环之后的代码。
示例
fn main() {
let mut number = 1;
while number <= 5 {
println!("{}", number);
number += 1;
}
}
1.2 break语句
break
语句用于立即终止while
循环,并跳出循环体,继续执行循环之后的代码。这对于在满足特定条件时提前退出循环非常有用。
fn main() {
let mut number = 0;
while true { // 无限循环,但我们会用break来退出它
number += 1;
println!("{}", number);
if number >= 5 {
break; // 当number达到5时,退出循环
}
}
println!("Loop exited at number: {}", number);
}
1.3 continue语句
fn main() {
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for number in &numbers { // 注意:这里为了演示,实际上用for循环更合适,但while循环也适用
// 转换为while循环的示例(不推荐这样写,仅为了说明continue的用法)
let mut index = 0;
while index < numbers.len() {
if *number % 2 == 0 { // 检查数字是否为偶数
continue; // 如果是偶数,跳过当前迭代
}
println!("Odd number: {}", *number); // 只打印奇数
index += 1; // 注意:在while循环中需要手动管理索引
// 由于我们使用了for循环的变量number,这里实际上不需要index来遍历,
// 但在将for转换为while时,为了模拟遍历,我们保留了index。
// 在实际的while循环中,你应该根据需要来管理循环的状态。
// 下面的代码是为了说明而保留的,实际上在这个例子中不需要。
if index >= numbers.len() {
break; // 退出循环(在这个例子中,由于我们使用了for的简化逻辑,这里不会被执行到)
}
}
// 注意:上面的while循环逻辑是有问题的,因为它试图在每次for迭代中重新遍历整个vector。
// 正确的做法是直接使用for循环或者用一个单独的while循环来遍历vector。
// 下面的代码才是正确的while循环遍历vector的示例:
let correct_numbers = vec![1, 2, 3, 4, 5]; // 另一个示例vector
let mut correct_index = 0;
while correct_index < correct_numbers.len() {
let num = correct_numbers[correct_index];
if num % 2 == 0 {
correct_index += 1; // 直接跳到下一个迭代(虽然这里用continue也可以,但为了展示手动控制索引,我们没这么做)
continue; // 在这个例子中,continue是多余的,因为下面就是增加索引的操作。
// 但为了说明continue的用法,我们保留了它。
}
println!("Odd number in correct loop: {}", num);
correct_index += 1;
}
}
// 注意:上面的for循环部分是不正确的,仅用于说明continue的用法。
// 正确的做法应该是直接使用一个while循环来遍历vector,如下所示:
let numbers_again = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let mut index_again = 0;
while index_again < numbers_again.len() {
let num = numbers_again[index_again];
if num % 2 != 0 { // 打印奇数
println!("Odd number in while loop: {}", num);
}
index_again += 1;
}
}
2. for循环
2.1 基础
Rust编程语言中,for
循环是一种用于迭代集合(如数组、切片、向量、字符串、哈希映射的键或值、范围等)的便捷控制流结构。它提供了一种简洁且易于理解的方式来遍历集合中的每个元素,并对每个元素执行一段代码。
for element in iterable {
// 循环体:对iterable中的每个element执行的代码块
}
2.2 遍历数组
fn main() {
// 如果你想要修改向量中的元素(注意:这需要可变引用)
let mut mutable_numbers = vec![1, 2, 3, 4, 5];
for number in &mut mutable_numbers {
*number *= 2; // 将每个元素乘以2
}
println!("{:?}", mutable_numbers); // 输出: [2, 4, 6, 8, 10]
}
2.3 便利字符串的字符
fn main() {
let greeting = "Hello, world!";
for (index, char) in greeting.chars().enumerate() {
println!("Character '{}' at index {}", char, index);
}
}
2.4 注意事项
- 在遍历不可变集合时,
for
循环中的element
变量是不可变的。如果你需要修改集合中的元素,你需要获取一个可变引用(&mut
),并在循环体内使用解引用(*
)来修改元素的值。 - Rust的
for
循环是通过迭代器实现的,这意味着你可以对任何实现了IntoIterator
trait的类型使用for
循环。 - 在遍历哈希映射时,你可以分别遍历键、值或同时遍历键和值。这通常是通过调用
keys()
、values()
或iter()
方法来实现的。 - 范围(
Range
)在Rust中也是可迭代的,你可以使用..
来创建一个半开区间范围,或使用..=
来创建一个闭区间范围。