MST

星途 面试题库

面试题:Rust闭包捕获变量的常见方式及区别

在Rust中,闭包捕获变量有哪些常见方式?这些方式在所有权、借用等方面有什么区别?请举例说明。
42.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 常见捕获方式
    • 按值捕获(move 语义):闭包获取变量的所有权。
    • 按引用捕获(不可变借用):闭包借用变量的不可变引用。
    • 按可变引用捕获(可变借用):闭包借用变量的可变引用。
  2. 区别
    • 按值捕获(move 语义)
      • 所有权:变量所有权转移到闭包中。一旦闭包捕获变量,外部作用域不能再使用该变量。
      • 示例
fn main() {
    let num = 5;
    let closure = move || {
        println!("The number is: {}", num);
    };
    // 下面这行代码会报错,因为num的所有权已被闭包拿走
    // println!("num: {}", num); 
    closure();
}
  • 按引用捕获(不可变借用)
    • 所有权:变量所有权仍在外部作用域,闭包只是借用不可变引用,外部作用域在闭包生命周期内可以继续使用该变量,但不能修改。
    • 示例
fn main() {
    let num = 5;
    let closure = || {
        println!("The number is: {}", num);
    };
    println!("num: {}", num); 
    closure();
}
  • 按可变引用捕获(可变借用)
    • 所有权:变量所有权仍在外部作用域,闭包借用可变引用。在闭包使用该可变引用期间,外部作用域不能再使用该变量,以避免数据竞争。
    • 示例
fn main() {
    let mut num = 5;
    let closure = || {
        num += 1;
        println!("The number is: {}", num);
    };
    // 下面这行代码会报错,因为闭包借用了num的可变引用
    // println!("num: {}", num); 
    closure();
}