MST

星途 面试题库

面试题:Rust中闭包与匿名函数的参数捕获方式对比

请阐述在Rust中,闭包是如何捕获其所在环境中的参数的,与匿名函数在参数获取方式上有什么不同?请举例说明。
21.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

闭包捕获环境参数方式

在Rust中,闭包可以通过三种方式捕获其所在环境中的参数:

  1. 按值捕获(move语义):闭包获取环境中变量的所有权。例如:
fn main() {
    let x = 5;
    let closure = move || println!("x is: {}", x);
    // 这里不能再使用x,因为所有权被闭包拿走
    // println!("x is: {}", x); // 这行代码会报错
    closure();
}
  1. 按可变借用捕获:闭包可以可变地借用环境中的变量。例如:
fn main() {
    let mut x = 5;
    let closure = || {
        x += 1;
        println!("x is: {}", x);
    };
    closure();
    println!("x is: {}", x);
}
  1. 按不可变借用捕获:闭包不可变地借用环境中的变量。例如:
fn main() {
    let x = 5;
    let closure = || println!("x is: {}", x);
    closure();
    println!("x is: {}", x);
}

与匿名函数参数获取方式的不同

匿名函数不能捕获环境中的变量,它只能通过参数列表来接收外部传入的值。例如:

fn main() {
    let x = 5;
    // 匿名函数不能直接使用x,需要将x作为参数传入
    let func = |y| println!("y is: {}", y);
    func(x);
}

闭包则可以灵活地捕获环境中的变量,无需在参数列表中显式声明这些变量,这使得闭包在处理与环境相关的逻辑时更加便捷和灵活。