0Pricing
Learn Rust Coding · 课时

闭包

匿名函数

闭包 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

什么是闭包

闭包是一种匿名函数,可以存储在变量中并在稍后调用。它的参数写在一对竖线之间。

fn main() {
    let add_one = |x| x + 1;
    println!("{}", add_one(4));
}

闭包语法

参数写在 |...| 之间,后面跟着函数体。如果只有一个表达式,则不需要花括号。

  • |x| x + 1 — 一个参数。
  • |a, b| a + b — 两个参数。
fn main() {
    let multiply = |a, b| a * b;
    println!("{}", multiply(3, 5));
}

多行闭包

如果函数体包含多条语句,请像定义函数一样将函数体放在花括号中。

fn main() {
    let describe = |n: i32| {
        let doubled = n * 2;
        println!("{} doubled is {}", n, doubled);
    };
    describe(7);
}

捕获环境

与普通函数不同,闭包可以捕获周围作用域中的变量,并在闭包内部使用它们。

fn main() {
    let factor = 10;
    let scale = |x| x * factor;
    println!("{}", scale(5));
}

闭包中的类型推断

闭包通常会根据使用方式推断参数和返回值的类型,因此类型注解是可选的。

在需要时,您可以添加类型以提高代码的清晰度。

fn main() {
    let greet = |name: &str| -> String {
        format!("Hello, {}!", name)
    };
    println!("{}", greet("Rust"));
}

将闭包作为参数

许多标准方法都接受闭包。例如,map 会将闭包应用于每个元素。

fn main() {
    let nums = vec![1, 2, 3];
    let doubled: Vec<i32> = nums.iter().map(|x| x * 2).collect();
    println!("{:?}", doubled);
}

使用闭包进行筛选

filter 方法只保留闭包返回 true 的元素。

fn main() {
    let nums = vec![1, 2, 3, 4, 5, 6];
    let evens: Vec<i32> = nums.into_iter().filter(|x| x % 2 == 0).collect();
    println!("{:?}", evens);
}

存储闭包

闭包具有唯一的匿名类型,但您可以将它们存储在变量中并重复使用。

fn main() {
    let is_even = |n: i32| n % 2 == 0;
    println!("{} {}", is_even(4), is_even(7));
}

闭包与函数的区别

区别:

  • 函数无法捕获周围的变量,而闭包可以。
  • 闭包没有名称,通常也比较简短。
  • 闭包的类型通常会被推断出来。
fn main() {
    let base = 100;
    let bonus = |earned: i32| earned + base;
    println!("{}", bonus(25));
}

返回计算结果

将闭包与迭代器结合起来,可以通过清晰且富有表现力的处理流程计算结果。

fn main() {
    let nums = vec![10, 20, 30];
    let total: i32 = nums.iter().map(|x| x + 1).sum();
    println!("total {}", total);
}

闭包通过引用捕获

默认情况下,闭包会借用捕获的变量。如果变量只是被借用的,您之后仍然可以在闭包外读取它们。

fn main() {
    let name = String::from("Ada");
    let printer = || println!("Name: {}", name);
    printer();
    println!("still usable: {}", name);
}

快速检查

回顾闭包的一项重要能力。

总结

Rust 中的闭包:

  • 以 |params| body 形式编写的匿名函数。
  • 可以捕获其环境中的变量。
  • 类型通常会被推断出来。
  • 广泛用于 map 和 filter 等迭代器方法。
fn main() {
    let tax = 0.2;
    let with_tax = |price: f64| price * (1.0 + tax);
    println!("{}", with_tax(50.0));
}

常见问题解答

「闭包」课时是免费的吗?

是的 — 「闭包」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「闭包」这节课中我会学到什么?

匿名函数 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「闭包」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 定义函数
  2. 表达式与语句
  3. 闭包
  4. Fn、FnMut、FnOnce
← 返回 Learn Rust Coding