面试题答案
一键面试fn outer_function() {
let outer_variable = String::from("Hello, Rust!");
// 定义嵌套函数(闭包)
let inner_function = || {
println!("Inner function: {}", outer_variable);
};
{
// 在不同作用域下调用闭包
inner_function();
}
}
变量生命周期
outer_variable
:它的生命周期从在outer_function
中定义开始,直到outer_function
结束。因为闭包inner_function
捕获了outer_variable
,所以outer_variable
的生命周期会被延长到闭包inner_function
不再被使用为止。在这个例子中,当outer_function
结束时,闭包inner_function
不再被使用,outer_variable
的生命周期也就结束了。inner_function
:闭包inner_function
的生命周期从定义开始,到它最后一次被调用之后结束。在这个例子中,当outer_function
结束时,inner_function
不会再被调用,其生命周期结束。
捕获变量原理
闭包可以捕获其定义所在作用域中的变量。在Rust中,闭包捕获变量有三种方式:
- 按值捕获(
Copy
语义):如果被捕获的变量实现了Copy
trait,闭包会按值捕获该变量。这意味着闭包会获得变量的一份拷贝,原变量不受影响。 - 按引用捕获:如果被捕获的变量没有实现
Copy
trait,闭包会按引用捕获该变量。在这种情况下,闭包会借用该变量,所以原变量的生命周期必须长于闭包的生命周期。在上述例子中,outer_variable
是String
类型,没有实现Copy
trait,所以闭包inner_function
按引用捕获outer_variable
。 - 按可变引用捕获:如果需要在闭包中修改捕获的变量,可以使用
mut
关键字将闭包声明为可变的,这样闭包会按可变引用捕获变量。
在这个例子中,闭包inner_function
按引用捕获了outer_variable
,从而可以在闭包内部访问outer_variable
的值。由于闭包持有对outer_variable
的引用,outer_variable
的生命周期会被延长到闭包不再被使用。