我一起使用lazy-init和sysinfo个包装箱。获取有关流程的信息非常昂贵,所以我认为我会将其隐藏在Lazy<T>
后面,实际上是Lazy<Process>
。所以我有一个小结构 - 只关注相关的部分:
pub struct ProgramInfo {
process: Lazy<Process>
}
以及获取Process
的函数:
impl ProgramInfo {
pub fn process(&self) -> &Process {
self.process.get_or_create(|| {
let system = System::new();
let pid = sysinfo::get_current_pid();
let ref_to_process = system.get_process(pid).unwrap();
ref_to_process.clone()
})
}
我添加了clone()
以使其编译,但它让我感到烦恼,因为它似乎没必要。正在制作Process结构的第二个副本,以便可以将其移动到ProgramInfo.process
。有没有办法只移动Process
引用的ref_to_process
?我尝试将最后一行改为
*ref_to_process
但是这不会编译,给出错误“无法移出借来的内容”。
答案 0 :(得分:2)
通过粗略阅读sysinfo
包,答案是不。
似乎没有一种方法可以返回除Process
之外的任何内容;因此System
永远不会放弃所有权,试图窃取它是不安全的......
对我来说更合适的解决方案是将ProgramInfo
更改为:
system: Lazy<System>
,system
当前的PID。效率如何取决于system
每次是否重新读取过程信息。
话虽如此,从纯粹的理论立场,你无论如何都可以偷走它:
ptr::read
创建实例的副本mem::forget
上致电system
,以便System
实例泄露,从而永不销毁。我怀疑这是你想要的,我绝对不会推荐它。