MST

星途 面试题库

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

在Rust中,闭包可以通过不同方式捕获其环境中的变量,分别是什么方式?这些捕获方式在所有权和可变性方面有何区别?请举例说明。
16.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在Rust中,闭包可以通过以下三种方式捕获其环境中的变量:

  1. 不可变借用(&T:闭包以不可变引用的方式捕获环境中的变量。这意味着闭包可以读取这些变量,但不能修改它们。这种捕获方式不会转移变量的所有权,并且允许多个不可变借用同时存在。
fn main() {
    let x = 10;
    let closure = || println!("x: {}", x);
    closure();
    println!("x after closure: {}", x);
}

在这个例子中,闭包closure以不可变借用的方式捕获了变量x,可以读取x的值,但闭包执行后x仍然可用。

  1. 可变借用(&mut T:闭包以可变引用的方式捕获环境中的变量。这允许闭包修改这些变量,但同一时间只能有一个可变借用存在。
fn main() {
    let mut x = 10;
    let closure = || {
        x += 1;
        println!("x: {}", x);
    };
    closure();
    println!("x after closure: {}", x);
}

在这个例子中,闭包closure以可变借用的方式捕获了变量x,可以修改x的值,闭包执行后x的值也发生了改变。

  1. 所有权转移(T:闭包获取环境中变量的所有权,变量的所有权被转移到闭包内部,外部不再能使用该变量。
fn main() {
    let x = String::from("hello");
    let closure = move || println!("x: {}", x);
    // println!("x after closure: {}", x); // 这行代码会报错,因为x的所有权已被闭包转移
    closure();
}

在这个例子中,闭包closure通过move关键字获取了变量x的所有权,外部不能再使用x,只有闭包内部可以使用。

总结:

  • 不可变借用:不转移所有权,可读取但不可修改,允许多个不可变借用。
  • 可变借用:不转移所有权,可读取和修改,但同一时间只能有一个可变借用。
  • 所有权转移:转移变量的所有权到闭包,外部不再能使用该变量。