MST
星途 面试题库

面试题:Rust闭包中move关键字与生命周期的交互

考虑以下Rust代码片段: ```rust fn create_closure() -> impl Fn() { let s = String::from("closure data"); // 这里应该如何使用move关键字创建一个闭包,使得闭包可以安全返回并且能正确访问s? // 同时说明这个闭包的生命周期是如何与变量s的生命周期相关联的。 } ``` 请完成代码,并详细解释闭包的生命周期以及move关键字在其中所起的作用。
14.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn create_closure() -> impl Fn() {
    let s = String::from("closure data");
    move || println!("{}", s)
}

闭包的生命周期解释

  1. 变量 s 的生命周期:在 create_closure 函数中,s 是在函数内部创建的局部变量。通常情况下,当函数结束时,这个局部变量 s 会被销毁。
  2. 闭包的生命周期:这里返回的闭包需要访问 s。如果不使用 move 关键字,闭包默认会以借用的方式捕获 s。但由于函数结束时 s 会被销毁,闭包在函数返回后再访问 s 就会产生悬垂引用(dangling reference),导致未定义行为。
  3. move 关键字的作用:使用 move 关键字后,闭包会获取 s 的所有权。这意味着 s 的所有权从函数转移到了闭包中。所以即使 create_closure 函数结束,s 也不会被销毁,因为闭包拥有它的所有权。只要闭包存在,s 就会一直存在,从而确保闭包能够安全地访问 s

总结来说,move 关键字改变了闭包捕获变量的方式,从借用变为获取所有权,解决了闭包生命周期和捕获变量生命周期之间的潜在冲突,使闭包能够安全地返回并访问捕获的变量。