请考虑以下代码:
e
无法借用
e.key_map
作为可变对象,因为e.key_map
也被借用为不可变的
但是当f
的借用结束时,我将无法再访问{{1}}。那么我怎样才能调用地图中的闭包?
答案 0 :(得分:1)
那么我怎样才能调用地图内的闭包呢?
这取决于适合的行为。
如果您已经解决了问题,如果从f(&mut e)
借用f
,则无法拨打e
。解决方案
不要将&mut e
传递给该函数。如果E
不在您的控制之下,这是不切实际的。
停止f
借用e
。由于CmdType
不具备Clone
能力,因此不能简单地将其复制出来。但是,您应该可以暂时从地图中删除f
:
let removed = e.key_map.remove(&'q');
if let Some(f) = removed {
f(&mut e);
e.key_map.insert('q', f);
}
答案 1 :(得分:0)
一种解决方案是让E
不拥有地图,如果这是合适的,而是将该功能与另一个结构分开。像这样:
struct K {
key_map: HashMap<KeyCode, Box<CmdType>>,
}
impl K {
fn map_key(&mut self, key: KeyCode, function: Box<CmdType>) {
self.key_map.insert(key, function);
}
}
struct E;
impl E {
fn quit(&mut self) { println!("quitting"); /* ... */ }
}
fn main() {
let mut k = K { key_map: HashMap::new() };
k.map_key('q', Box::new(|e: &mut E| e.quit()));
let mut e = E;
match k.key_map.get(&'q') {
Some(f) => f(&mut e),
None => {}
}
}
如果需要, E
也可能会引用K
实例。