MST

星途 面试题库

面试题:Rust中闭包捕获变量的方式及应用场景

请解释Rust闭包捕获变量有哪些方式(如按值捕获、按引用捕获等),并举例说明每种捕获方式适合的应用场景。
21.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 按值捕获(move 语义)
    • 说明:闭包获取变量的所有权。当闭包被调用时,捕获的变量会被移动到闭包内部,原作用域不再能访问该变量。
    • 示例
fn main() {
    let num = 5;
    let closure = move || println!("Captured value: {}", num);
    // 下面这行代码会报错,因为 num 的所有权被闭包获取
    // println!("num: {}", num); 
    closure();
}
  • 应用场景:当需要将变量的所有权转移到闭包中,并且闭包可能会在原变量作用域结束后继续存活时使用。比如,将闭包传递给另一个线程执行,因为线程可能会在当前函数结束后继续运行,此时需要转移变量所有权到线程内的闭包中,以保证变量的生命周期与线程一致。
  1. 按不可变引用捕获
    • 说明:闭包获取变量的不可变引用,原变量在闭包调用期间仍然可以在其他地方以不可变方式访问。
    • 示例
fn main() {
    let num = 5;
    let closure = || println!("Captured value: {}", num);
    println!("num: {}", num); 
    closure();
}
  • 应用场景:当闭包只需要读取变量的值,并且原变量在闭包执行期间不会被修改时使用。例如,在对集合进行迭代处理时,闭包用于计算一些基于集合元素的统计信息,只需要读取元素值,不修改原集合和元素。
  1. 按可变引用捕获
    • 说明:闭包获取变量的可变引用,原变量在闭包调用期间只能通过该可变引用进行修改,不能在其他地方同时以可变方式访问。
    • 示例
fn main() {
    let mut num = 5;
    let closure = || {
        num += 1;
        println!("Captured value: {}", num);
    };
    closure();
    println!("num: {}", num); 
}
  • 应用场景:当闭包需要修改捕获的变量,并且要保证在闭包执行期间对该变量修改的唯一性时使用。比如,在一个函数中需要通过闭包来更新某个状态变量的值。