我正在努力寻找一种优雅的解决方案来访问 Rust 中的嵌套地图以实现只读目的。我有这种情况,理想情况下,作为示例,我可以返回对空映射的引用(这当然不起作用,因为空哈希映射由函数拥有):
struct S {
stuff: HashMap<A, HashMap<B, C>>
}
impl S {
fn get(&self, a: &A) -> &HashMap<B,C> {
return self.stuff.get(a).unwrap_or(&HashMap::new());
}
}
Run Code Online (Sandbox Code Playgroud)
无法保证地图内容将具有键 a,因此必须处理可选性。
我希望解决方案以有效的方式(无副本/移动)实现使用此或类似签名的方法 get ,因为地图内容可能非常大。
我只能想到以下解决方案,但我认为一定有更直接的解决方案:
在我看来,解决方案(3)是实现上述目标的最佳方法,但也许我遗漏了一些东西,并且有更直接的方法?
我有一个简单的 winit 应用程序,它创建一个空窗口并运行 EventLoop:
event_loop.run(move |event, _, control_flow| {
control_flow.set_wait_until(std::time::Instant::now() + Duration::from_millis(1000));
match event {
Event::WindowEvent{ ref event, window_id, } => {},
Event::MainEventsCleared => {
window.request_redraw()
},
_ => {}
}
});
Run Code Online (Sandbox Code Playgroud)
在 MacOS 上,此进程 100% 使用 1 个 CPU 核心。如果我删除 window.request_redraw 调用,或者当我人为地限制线程睡眠时(无论设置等待直到控制流程),CPU 使用率会急剧下降到 10% 左右。这表明 wait/wait Until 无法正常工作,因为如果我理解正确的话,我希望每 1 秒才会看到对 request_redraw 的调用。
除了 thread::sleep/wait/wait Until 之外,还有什么方法可以限制事件循环运行频率,或者我做错了什么?