📜  for 循环 - Rust (1)

📅  最后修改于: 2023-12-03 15:15:10.149000             🧑  作者: Mango

Rust中的for循环

Rust中的for循环是一种非常常见的控制流结构,用于迭代一个集合(collection)中的每个元素。Rust支持使用for循环迭代各种类型的集合,包括数组、向量、字符串、哈希表等等。

基本语法

Rust中的for循环有两种基本语法:

// 语法1:使用in关键字迭代
for element in collection {
    // 在循环体中对每个元素执行操作
}

// 语法2:使用迭代器(iterator)迭代
for element in iterator {
    // 在循环体中对每个元素执行操作
}

其中,element表示每个元素的静态类型,collectioniterator分别表示要迭代的集合或迭代器。

在语法1中,在每次循环时,element会依次取到集合中的元素。在语法2中,element会依次取到迭代器中的元素。

迭代各种类型的集合

在Rust中,需要使用不同的语法和迭代器来迭代不同类型的集合。以下是迭代常见集合的示例:

数组

数组是一种由相同静态类型元素构成的固定长度序列。我们可以使用&操作符将数组转换为一个切片(slice),然后使用语法1迭代切片:

let arr = [1, 2, 3, 4, 5];
for elem in &arr {
    println!("{}", elem);
}
向量

向量是一个变长的序列,它可以自动扩容。我们可以使用语法1或语法2迭代向量:

let vec = vec![1, 2, 3, 4, 5];
for elem in &vec {
    println!("{}", elem);
}

// 或者使用迭代器
for elem in vec.iter() {
    println!("{}", elem);
}
字符串

字符串是一个用于存储文本的集合类型。我们可以使用语法1或语法2迭代字符串:

let str = "hello, world";
for ch in str.chars() {
    println!("{}", ch);
}

// 或者迭代字节数组
for byte in str.bytes() {
    println!("{}", byte);
}
哈希表

哈希表是一种由键值对构成的集合类型。我们可以使用语法2和哈希表的迭代器into_iter迭代哈希表:

use std::collections::HashMap;

let mut map = HashMap::new();
map.insert("name", "Alice");
map.insert("age", "30");

for (key, value) in map.into_iter() {
    println!("{}: {}", key, value);
}
迭代时修改集合

在Rust中,当我们迭代一个集合时,我们通常不允许修改集合。这是因为在大多数情况下,我们不希望同时迭代和修改同一个集合,这可能导致不可预期的结果。如果我们需要在迭代时修改集合,可以使用可变迭代器(mutable iterator)。

可变迭代器可以修改集合,但是它们只能在自身的作用域内存在。在可变迭代器的作用域内,不允许对集合进行其他操作,例如直接访问集合中的元素、向集合中插入或删除元素等等。这是为了保证可变迭代器的安全性和正确性。

以下是一个使用可变迭代器迭代向量并修改其中元素的示例:

let mut vec = vec![1, 2, 3, 4, 5];
for elem in vec.iter_mut() {
    *elem *= 2;
}
println!("{:?}", vec);  // 输出 [2, 4, 6, 8, 10]

在这个示例中,我们使用了向量的可变迭代器iter_mut,并且在迭代器的作用域内修改了向量中的元素。注意到在迭代器的作用域内,我们不能直接访问向量中的元素,因为这会破坏迭代器的不可变性。

总结

Rust中的for循环是一种非常实用的控制流结构,它可以迭代各种类型的集合,并且支持使用可变迭代器修改集合。与其他编程语言相比,Rust的for循环有更高的安全性和正确性保障,这是由Rust的类型系统和所有权模型所提供的。