MST

星途 面试题库

面试题:Rust Fn trait自定义实现中的闭包与所有权

假设有一个自定义结构体`MyStruct`,它内部包含一个`String`类型的成员变量。现在要实现`Fn` trait,使得这个结构体实例能够像函数一样被调用,并且在调用过程中能够正确处理所有权问题,避免内存泄漏或悬空引用。请写出完整的结构体定义、`Fn` trait实现以及调用示例代码,并解释在实现过程中是如何处理所有权的。
38.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct MyStruct {
    data: String,
}

impl std::ops::Fn() for MyStruct {
    type Output = String;

    fn call(&self) -> String {
        self.data.clone()
    }
}

fn main() {
    let my_struct = MyStruct {
        data: "Hello, World!".to_string(),
    };
    let result = my_struct();
    println!("Result: {}", result);
}

所有权处理解释

  1. 结构体定义MyStruct包含一个String类型的成员变量dataString拥有它所存储的字符串的所有权。
  2. Fn trait实现:这里实现Fn trait,因为call方法接受&self,意味着它不会获取MyStruct实例的所有权,而是借用。在call方法内部,使用clone方法复制data,这是因为String类型实现了Clone trait,clone会创建一个新的String实例,这样原始的data所有权仍归MyStruct实例,新复制的String所有权归调用者。
  3. 调用示例:在main函数中创建MyStruct实例并调用它,就像调用一个函数一样。由于call方法返回的是data的克隆,所以调用者获得了新的String的所有权,原始MyStruct实例的data仍然存在,避免了内存泄漏和悬空引用。