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