MST

星途 面试题库

面试题:Rust嵌套函数与闭包及作用域的交互

编写Rust代码,在外层函数中定义一个嵌套函数,嵌套函数捕获外层函数的局部变量。同时,将嵌套函数赋值给一个闭包变量,并在不同的作用域下调用这个闭包变量,阐述整个过程中变量的生命周期以及捕获变量的原理。
10.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn outer_function() {
    let outer_variable = String::from("Hello, Rust!");

    // 定义嵌套函数(闭包)
    let inner_function = || {
        println!("Inner function: {}", outer_variable);
    };

    {
        // 在不同作用域下调用闭包
        inner_function();
    }
}

变量生命周期

  1. outer_variable:它的生命周期从在outer_function中定义开始,直到outer_function结束。因为闭包inner_function捕获了outer_variable,所以outer_variable的生命周期会被延长到闭包inner_function不再被使用为止。在这个例子中,当outer_function结束时,闭包inner_function不再被使用,outer_variable的生命周期也就结束了。
  2. inner_function:闭包inner_function的生命周期从定义开始,到它最后一次被调用之后结束。在这个例子中,当outer_function结束时,inner_function不会再被调用,其生命周期结束。

捕获变量原理

闭包可以捕获其定义所在作用域中的变量。在Rust中,闭包捕获变量有三种方式:

  1. 按值捕获(Copy语义):如果被捕获的变量实现了Copy trait,闭包会按值捕获该变量。这意味着闭包会获得变量的一份拷贝,原变量不受影响。
  2. 按引用捕获:如果被捕获的变量没有实现Copy trait,闭包会按引用捕获该变量。在这种情况下,闭包会借用该变量,所以原变量的生命周期必须长于闭包的生命周期。在上述例子中,outer_variableString类型,没有实现Copy trait,所以闭包inner_function按引用捕获outer_variable
  3. 按可变引用捕获:如果需要在闭包中修改捕获的变量,可以使用mut关键字将闭包声明为可变的,这样闭包会按可变引用捕获变量。

在这个例子中,闭包inner_function按引用捕获了outer_variable,从而可以在闭包内部访问outer_variable的值。由于闭包持有对outer_variable的引用,outer_variable的生命周期会被延长到闭包不再被使用。