当前位置:首页 > Rust > 正文

掌握 Rust 迭代器(Iter:高效、安全地遍历集合)

在 Rust 编程语言中,迭代器(Iterator) 是处理集合数据的核心工具。无论你是初学者还是有经验的开发者,理解 iter() 方法及其背后的迭代器模式,都能让你写出更高效、更安全、更简洁的代码。

掌握 Rust 迭代器(Iter:高效、安全地遍历集合) Rust迭代器 iter方法 Rust编程入门 Rust集合遍历 第1张

什么是迭代器?

迭代器是一种设计模式,用于逐个访问集合中的元素,而无需暴露集合的内部结构。在 Rust 中,所有实现了 Iterator trait 的类型都可以被迭代。

最常见的入口就是 .iter() 方法。它返回一个不可变引用的迭代器,允许你安全地读取集合中的每个元素,而不会转移所有权。

基础用法:使用 iter() 遍历 Vec

假设我们有一个整数向量(Vec),想打印出每个数字:

let numbers = vec![1, 2, 3, 4, 5];for num in numbers.iter() {    println!("{}", num);}

这里,numbers.iter() 返回一个 std::slice::Iter<i32> 类型的迭代器。每次循环,num 是对向量中某个元素的不可变引用(即 &i32)。

注意:使用 .iter() 后,numbers 在循环结束后仍然可用,因为没有发生所有权转移——这是 Rust 安全性的体现。

对比:iter() vs into_iter() vs iter_mut()

Rust 提供了三种常见的迭代方式:

  • .iter():产生 &T,不获取所有权,只读。
  • .into_iter():产生 T,转移所有权,之后原集合不可用。
  • .iter_mut():产生 &mut T,可修改元素。

例如,使用 .iter_mut() 修改每个元素:

let mut scores = vec![80, 90, 75];for score in scores.iter_mut() {    *score += 5; // 给每个分数加5分}println!("{:?}", scores); // 输出: [85, 95, 80]

链式操作:map、filter 等高阶函数

Rust 的迭代器是惰性求值的,这意味着它们不会立即执行,直到你调用像 .collect().for_each() 这样的消费方法。

这使得我们可以轻松组合多个操作:

let numbers = vec![1, 2, 3, 4, 5, 6];let even_squares: Vec = numbers    .iter()    .filter(|&x| x % 2 == 0)   // 只保留偶数    .map(|x| x * x)           // 平方    .collect();               // 收集结果println!("{:?}", even_squares); // 输出: [4, 16, 36]

这段代码展示了如何使用 Rust迭代器 实现函数式编程风格,既清晰又高效。

为什么 iter() 对 Rust编程入门 很重要?

对于刚接触 Rust 的开发者来说,理解 iter() 是掌握 Rust集合遍历 的关键一步。它帮助你:

  • 避免索引越界错误(Rust 不鼓励手动索引)
  • 安全地共享数据(通过引用而非移动)
  • 写出更具表达力和可读性的代码
  • 利用编译器优化(迭代器通常会被内联优化为高效循环)

小结

通过本文,你应该已经掌握了 .iter() 的基本用法、与其他迭代方法的区别,以及如何结合 mapfilter 等方法构建强大的数据处理管道。记住,在 Rust 中,“迭代优于索引” 是一条黄金法则。

继续练习吧!尝试用迭代器重写你以前用 for 循环 + 索引写的代码,你会发现 Rust 的优雅与力量。