我正在使用lazy-init和 sysinfo crate 在一起。获取有关进程的信息非常昂贵,因此我想将其隐藏在 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
但这不会编译,给出错误“无法移出借用的内容”。
最佳答案
粗略阅读 sysinfo
crate ,答案是否。
除了对 Process
的引用之外,似乎没有任何方法可以返回任何内容。 ;因此System
永远不会放弃所有权,尝试窃取它是不安全的...
对我来说似乎更容易接受的解决方案是更改 ProgramInfo
至:
- 捕获
system: Lazy<System>
, - 查询
system
每次针对当前PID。
其效率如何取决于 system
是否每次都重新读取进程信息,或不重新读取。
话虽如此,从纯粹理论的角度来看,无论如何你确实可以窃取它:
- 您可以使用
ptr::read
创建实例的副本, - 然后调用
mem::forget
上system
所以System
实例泄露,因此从未被销毁。
我怀疑这就是你想要的,我当然不会推荐它。
关于rust - 如何使用 sysinfo 箱消除这个(看似)不必要的 clone() 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45711295/