与集合的所有者一起调用集合中的集合

时间:2015-08-19 23:56:24

标签: compiler-errors rust borrow-checker

请考虑以下代码:

e

enter image description here,因为我试图将f传递给e

  

无法借用e.key_map作为可变对象,因为e.key_map也被借用为不可变的

但是当f的借用结束时,我将无法再访问{{1}}。那么我怎样才能调用地图中的闭包?

2 个答案:

答案 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实例。