MST

星途 面试题库

面试题:Rust中闭包捕获变量的方式有哪些

请详细阐述Rust闭包捕获变量时,按值捕获、按可变引用捕获和按不可变引用捕获这几种方式的特点及使用场景,并各举一个简单的代码示例。
27.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

按值捕获

  1. 特点:闭包获取变量的所有权,闭包内对变量的操作不会影响外部同名变量,且闭包执行后变量被消耗。
  2. 使用场景:当闭包需要独占变量的所有权,且不希望影响外部变量状态时使用。
  3. 代码示例
fn main() {
    let num = 5;
    let closure = || {
        println!("The value is: {}", num);
    };
    closure();
    // 这里不能再使用 num,因为所有权被闭包获取
    // println!("num: {}", num);  // 这行代码会报错
}

按不可变引用捕获

  1. 特点:闭包以不可变引用的方式访问外部变量,外部变量在闭包执行期间不能被修改,但可以在闭包外正常使用,闭包不会获取变量的所有权。
  2. 使用场景:当闭包仅需读取外部变量,且外部变量在闭包执行期间不需要修改时使用。
  3. 代码示例
fn main() {
    let num = 5;
    let closure = || {
        println!("The value is: {}", num);
    };
    closure();
    println!("num: {}", num);
}

按可变引用捕获

  1. 特点:闭包以可变引用的方式访问外部变量,允许在闭包内修改外部变量的值,外部变量在闭包执行期间不能被其他代码修改,闭包不会获取变量的所有权。
  2. 使用场景:当闭包需要修改外部变量,且确保闭包执行期间外部不会同时修改该变量时使用。
  3. 代码示例
fn main() {
    let mut num = 5;
    let closure = || {
        num += 1;
        println!("The value is: {}", num);
    };
    closure();
    println!("num: {}", num);
}