面试题答案
一键面试嵌套函数捕获环境变量特点
- 不能捕获环境变量:在Rust中,嵌套函数不能捕获其外部作用域中的变量。这意味着嵌套函数只能访问其参数和它自己内部定义的变量。
闭包捕获环境变量特点
- 自动推断捕获方式:闭包可以捕获其定义时所在环境中的变量。Rust会根据闭包对环境变量的使用方式,自动推断是按值捕获(
Copy
语义)还是按引用捕获(借用语义)。 - 灵活的生命周期:闭包捕获的变量生命周期与闭包本身的生命周期相关联,只要闭包存活,被捕获的变量就会保持有效。
相同点
- 定义在其他函数内部:嵌套函数和闭包都可以定义在其他函数内部,形成一种层级结构。
不同点
- 捕获能力:嵌套函数不能捕获环境变量,而闭包可以捕获环境变量。
- 所有权转移:闭包捕获变量时,可能会转移变量的所有权,而嵌套函数不存在此情况。
代码示例
fn outer_function() {
let outer_variable = 42;
// 嵌套函数
fn nested_function() {
// 这里无法访问outer_variable
let inner_variable = 10;
println!("Inner variable: {}", inner_variable);
}
nested_function();
// 闭包
let closure = || {
println!("Outer variable from closure: {}", outer_variable);
};
closure();
}
fn main() {
outer_function();
}
在上述代码中,nested_function
不能访问outer_variable
,而闭包closure
可以捕获并访问outer_variable
。