2.3 控制流
控制流语句允许程序根据条件执行不同的代码块或重复执行某些代码,直到满足特定条件。我们已经讨论了 if-else
条件语句和 loop
、while
循环。现在,我们将深入探讨 Rust 中的 for
循环及其相关概念,如迭代器。
2.3.3 for 循环和迭代器
for
循环是 Rust 中最常用的循环结构之一,尤其适用于遍历集合(如数组、向量、哈希映射等)中的元素。它不仅简洁而且安全,因为它自动处理索引和边界检查,减少了出错的可能性。
2.3.3.1 基本 for
循环
基本的 for
循环语法如下:
fn main() {
let arr = [10, 20, 30, 40, 50];
for element in arr.iter() {
println!("the value is: {}", element);
}
}
在这个例子中,arr.iter()
创建了一个迭代器,它会依次返回数组 arr
中的每一个元素。for
循环则遍历这些元素,并将每个元素绑定到变量 element
上,在每次迭代中打印该元素的值。
2.3.3.2 使用范围进行循环
除了遍历集合,for
循环还可以与范围(Range
)一起使用来生成一系列数值:
fn main() {
for number in (1..5).rev() { // 使用 rev() 方法反转范围
println!("{}", number);
}
println!("LIFTOFF!!!");
}
这段代码首先创建了一个从 1 到 4 的范围(注意,Rust 的范围是左闭右开的),然后使用 .rev()
方法将其反转。因此,输出将是:
4
3
2
1
LIFTOFF!!!
2.3.3.3 迭代器
迭代器是一种可以产生一系列项的抽象,通常用于遍历集合中的元素。Rust 的标准库为许多数据结构提供了内置的迭代器实现。你可以通过调用 .iter()
方法来获取一个迭代器。
例如,对于字符串切片(&str
),你可以这样遍历它的字符:
fn main() {
let string_slice = "Hello Rust";
for c in string_slice.chars() {
println!("{}", c);
}
}
这段代码将逐个打印字符串 "Hello Rust"
中的每个字符。
2.3.3.4 自定义迭代器
你也可以为自定义类型实现迭代器模式。要做到这一点,需要实现 Iterator
trait,并定义 next
方法,该方法返回一个 Option<Self::Item>
类型的值。当没有更多项可提供时,next
应返回 None
。
下面是一个简单的例子,展示如何为一个计数器实现迭代器:
struct Counter {
count: usize,
}
impl Counter {
fn new() -> Counter {
Counter { count: 0 }
}
}
impl Iterator for Counter {
type Item = usize;
fn next(&mut self) -> Option<Self::Item> {
if self.count < 5 {
self.count += 1;
Some(self.count)
} else {
None
}
}
}
fn main() {
let counter = Counter::new();
for number in counter {
println!("{}", number);
}
}
上述代码定义了一个名为 Counter
的结构体,并实现了 Iterator
trait。next
方法每次被调用时都会增加计数器的值,直到达到 5 后返回 None
,从而结束迭代。
总结
通过掌握 for
循环和迭代器的概念,你可以更高效地遍历集合和其他序列类型的元素。无论是简单的数值范围还是复杂的自定义类型,Rust 提供了强大的工具来帮助你编写清晰、高效的代码。希望这部分内容能够帮助你更好地理解和应用 Rust 中的循环和迭代机制。