面试题答案
一键面试fn create_closure() -> impl Fn() {
let s = String::from("closure data");
move || println!("{}", s)
}
闭包的生命周期解释
- 变量
s
的生命周期:在create_closure
函数中,s
是在函数内部创建的局部变量。通常情况下,当函数结束时,这个局部变量s
会被销毁。 - 闭包的生命周期:这里返回的闭包需要访问
s
。如果不使用move
关键字,闭包默认会以借用的方式捕获s
。但由于函数结束时s
会被销毁,闭包在函数返回后再访问s
就会产生悬垂引用(dangling reference),导致未定义行为。 move
关键字的作用:使用move
关键字后,闭包会获取s
的所有权。这意味着s
的所有权从函数转移到了闭包中。所以即使create_closure
函数结束,s
也不会被销毁,因为闭包拥有它的所有权。只要闭包存在,s
就会一直存在,从而确保闭包能够安全地访问s
。
总结来说,move
关键字改变了闭包捕获变量的方式,从借用变为获取所有权,解决了闭包生命周期和捕获变量生命周期之间的潜在冲突,使闭包能够安全地返回并访问捕获的变量。