MST

星途 面试题库

面试题:Rust函数与闭包在生命周期协同方面的应用

假设有一个结构体`MyStruct`包含一个`String`类型的成员变量。定义一个函数`modify_struct`,它接受`MyStruct`的可变引用和一个闭包作为参数。闭包需要修改`MyStruct`中的`String`成员变量内容。请阐述在这个过程中,闭包和函数参数的生命周期是如何协同工作的,并给出代码示例。
35.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

生命周期协同工作阐述

  1. 闭包生命周期:闭包捕获环境中的变量,并将这些变量的生命周期延长到闭包的生命周期内。在这种情况下,闭包捕获了MyStruct的可变引用,因此MyStruct的生命周期至少要和闭包的生命周期一样长。
  2. 函数参数生命周期:函数modify_struct接受MyStruct的可变引用,这意味着函数调用期间MyStruct必须保持有效。由于闭包在函数内部调用并修改MyStructMyStruct的生命周期必须覆盖函数调用和闭包执行的时间。因此,MyStruct的生命周期要长于函数调用和闭包执行的时间。

代码示例

struct MyStruct {
    data: String,
}

fn modify_struct(s: &mut MyStruct, f: impl FnOnce(&mut String)) {
    f(&mut s.data);
}

fn main() {
    let mut my_struct = MyStruct { data: "initial".to_string() };
    modify_struct(&mut my_struct, |s| {
        s.push_str(" modified");
    });
    println!("{}", my_struct.data);
}

在上述代码中,modify_struct函数接受MyStruct的可变引用和一个闭包。闭包对MyStruct中的String成员变量进行修改。my_struct的生命周期覆盖了函数调用和闭包执行的时间,确保闭包可以安全地修改MyStruct中的数据。