闭包与迭代器 #

一、闭包 #

1.1 基本语法 #

闭包是匿名函数,使用 || 定义:

rust
fn main() {
    let add = |a, b| a + b;
    
    println!("1 + 2 = {}", add(1, 2));
}

1.2 类型标注 #

rust
fn main() {
    let add = |a: i32, b: i32| -> i32 {
        a + b
    };
    
    println!("Result: {}", add(1, 2));
}

1.3 捕获环境变量 #

闭包可以捕获外部变量:

rust
fn main() {
    let x = 10;
    
    let add_x = |a| a + x;
    
    println!("5 + x = {}", add_x(5));  // 15
}

1.4 捕获方式 #

闭包有三种捕获方式:

  • FnOnce: 消费捕获的变量
  • FnMut: 可变借用
  • Fn: 不可变借用
rust
fn main() {
    let mut s = String::from("hello");
    
    // FnMut: 可变借用
    let mut append = || {
        s.push_str(" world");
    };
    append();
    println!("{}", s);
    
    // Fn: 不可变借用
    let print = || {
        println!("{}", s);
    };
    print();
    
    // FnOnce: 消费
    let consume = || {
        let _ = s;
    };
    consume();
    // println!("{}", s);  // 错误:s 已被消费
}

1.5 move 闭包 #

使用 move 强制获取所有权:

rust
fn main() {
    let s = String::from("hello");
    
    let print = move || {
        println!("{}", s);
    };
    
    print();
    // println!("{}", s);  // 错误:s 已被移动
}

1.6 作为参数 #

rust
fn apply<F>(f: F, x: i32) -> i32
where
    F: Fn(i32) -> i32,
{
    f(x)
}

fn main() {
    let double = |x| x * 2;
    
    let result = apply(double, 5);
    println!("Result: {}", result);
}

1.7 作为返回值 #

rust
fn create_adder(x: i32) -> impl Fn(i32) -> i32 {
    move |y| x + y
}

fn main() {
    let add_5 = create_adder(5);
    
    println!("5 + 3 = {}", add_5(3));
}

二、迭代器 #

2.1 创建迭代器 #

rust
fn main() {
    let v = vec![1, 2, 3, 4, 5];
    
    // iter(): 不可变引用
    for x in v.iter() {
        print!("{} ", x);
    }
    println!();
    
    // iter_mut(): 可变引用
    let mut v2 = vec![1, 2, 3];
    for x in v2.iter_mut() {
        *x *= 2;
    }
    println!("{:?}", v2);
    
    // into_iter(): 获取所有权
    for x in v.into_iter() {
        print!("{} ", x);
    }
    println!();
}

2.2 消费适配器 #

rust
fn main() {
    let v = vec![1, 2, 3, 4, 5];
    
    // sum
    let sum: i32 = v.iter().sum();
    println!("Sum: {}", sum);
    
    // product
    let product: i32 = v.iter().product();
    println!("Product: {}", product);
    
    // count
    let count = v.iter().count();
    println!("Count: {}", count);
    
    // collect
    let doubled: Vec<i32> = v.iter().map(|x| x * 2).collect();
    println!("Doubled: {:?}", doubled);
}

2.3 迭代适配器 #

rust
fn main() {
    let v = vec![1, 2, 3, 4, 5];
    
    // map
    let doubled: Vec<i32> = v.iter().map(|x| x * 2).collect();
    println!("Doubled: {:?}", doubled);
    
    // filter
    let evens: Vec<&i32> = v.iter().filter(|x| *x % 2 == 0).collect();
    println!("Evens: {:?}", evens);
    
    // take
    let first_three: Vec<&i32> = v.iter().take(3).collect();
    println!("First three: {:?}", first_three);
    
    // skip
    let skip_two: Vec<&i32> = v.iter().skip(2).collect();
    println!("Skip two: {:?}", skip_two);
}

2.4 查找和匹配 #

rust
fn main() {
    let v = vec![1, 2, 3, 4, 5];
    
    // find
    let first_even = v.iter().find(|x| *x % 2 == 0);
    println!("First even: {:?}", first_even);
    
    // position
    let pos = v.iter().position(|x| *x == 3);
    println!("Position of 3: {:?}", pos);
    
    // any
    let has_even = v.iter().any(|x| x % 2 == 0);
    println!("Has even: {}", has_even);
    
    // all
    let all_positive = v.iter().all(|x| *x > 0);
    println!("All positive: {}", all_positive);
}

2.5 排序和比较 #

rust
fn main() {
    let mut v = vec![3, 1, 4, 1, 5, 9, 2, 6];
    
    // sort
    v.sort();
    println!("Sorted: {:?}", v);
    
    // sort_by
    v.sort_by(|a, b| b.cmp(a));
    println!("Reverse: {:?}", v);
    
    // min / max
    let min = v.iter().min();
    let max = v.iter().max();
    println!("Min: {:?}, Max: {:?}", min, max);
}

2.6 折叠 #

rust
fn main() {
    let v = vec![1, 2, 3, 4, 5];
    
    // fold
    let sum = v.iter().fold(0, |acc, x| acc + x);
    println!("Sum: {}", sum);
    
    // reduce
    let product = v.iter().reduce(|acc, x| acc * x);
    println!("Product: {:?}", product);
}

2.7 链式调用 #

rust
fn main() {
    let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    
    let result: Vec<i32> = v
        .iter()
        .filter(|x| *x % 2 == 0)
        .map(|x| x * 2)
        .take(3)
        .collect();
    
    println!("Result: {:?}", result);  // [4, 8, 12]
}

三、实践示例 #

3.1 数据处理管道 #

rust
#[derive(Debug)]
struct Person {
    name: String,
    age: u32,
}

fn main() {
    let people = vec![
        Person { name: String::from("Alice"), age: 30 },
        Person { name: String::from("Bob"), age: 25 },
        Person { name: String::from("Charlie"), age: 35 },
        Person { name: String::from("David"), age: 20 },
    ];
    
    let names: Vec<&str> = people
        .iter()
        .filter(|p| p.age >= 25)
        .map(|p| p.name.as_str())
        .collect();
    
    println!("Names: {:?}", names);
}

3.2 分组和统计 #

rust
use std::collections::HashMap;

fn main() {
    let words = vec!["apple", "banana", "apple", "cherry", "banana", "apple"];
    
    let counts: HashMap<&str, usize> = words
        .iter()
        .fold(HashMap::new(), |mut acc, &word| {
            *acc.entry(word).or_insert(0) += 1;
            acc
        });
    
    println!("Counts: {:?}", counts);
}

3.3 自定义迭代器 #

rust
struct Counter {
    count: usize,
    max: usize,
}

impl Counter {
    fn new(max: usize) -> Self {
        Counter { count: 0, max }
    }
}

impl Iterator for Counter {
    type Item = usize;
    
    fn next(&mut self) -> Option<Self::Item> {
        if self.count < self.max {
            self.count += 1;
            Some(self.count)
        } else {
            None
        }
    }
}

fn main() {
    let counter = Counter::new(5);
    
    for num in counter {
        println!("{}", num);
    }
}

四、总结 #

本章学习了:

  • 闭包语法和捕获机制
  • Fn、FnMut、FnOnce trait
  • 迭代器创建和使用
  • 迭代适配器和消费适配器
  • 链式调用
  • 自定义迭代器

下一章,我们将学习复合类型。

最后更新:2026-03-27