返回

RUST学习日记 第20课 认识和使用闭包

闲谈

闭包的定义

闭包是Rust函数的一种特殊表现形式,它允许将函数作为另一个函数的参数或返回值,这为Rust代码带来了更大的灵活性。闭包可以捕获其定义所在作用域的变量,即使这些变量在闭包定义之后才被创建或被释放。

闭包的语法

闭包的语法与函数的语法非常相似,但闭包没有名称,而是使用||符号来表示。例如:

let add = |x, y| x + y;

这个闭包将两个数字x和y相加,并返回结果。

闭包的使用场景

闭包的使用场景非常广泛,例如:

  • 作为另一个函数的参数或返回值
  • 用作回调函数
  • 用作线程或协程的执行函数
  • 用作生成器的生成函数

闭包的示例

以下是一些闭包的示例:

  • 使用闭包作为函数的参数:
fn apply(f: fn(i32) -> i32, x: i32) -> i32 {
    f(x)
}

let add_one = |x| x + 1;

let result = apply(add_one, 10);

println!("{}", result); // 输出: 11
  • 使用闭包作为函数的返回值:
fn create_adder(x: i32) -> fn(i32) -> i32 {
    move |y| x + y
}

let add_ten = create_adder(10);

let result = add_ten(5);

println!("{}", result); // 输出: 15
  • 使用闭包作为回调函数:
fn for_each(f: fn(i32), xs: &[i32]) {
    for x in xs {
        f(x);
    }
}

let xs = vec![1, 2, 3, 4, 5];

for_each(|x| println!("{}", x), &xs);

// 输出:
// 1
// 2
// 3
// 4
// 5
  • 使用闭包作为线程或协程的执行函数:
use std::thread;

fn main() {
    let thread = thread::spawn(|| {
        println!("Hello from a new thread!");
    });

    thread.join().unwrap();
}

这个例子中,我们使用闭包作为线程的执行函数。

总结

闭包是Rust函数的一种特殊表现形式,它允许将函数作为另一个函数的参数或返回值。闭包可以捕获其定义所在作用域的变量,即使这些变量在闭包定义之后才被创建或被释放。闭包的使用场景非常广泛,例如,作为另一个函数的参数或返回值、用作回调函数、用作线程或协程的执行函数、用作生成器的生成函数等。