次のコードを検討してください。
use std::collections::HashMap;
type KeyCode = char;
type CmdType = Fn(&mut E);
struct E {
key_map: HashMap<KeyCode, Box<CmdType>>,
}
impl E {
fn map_key(&mut self, key: KeyCode, function: Box<CmdType>) {
self.key_map.insert(key, function);
}
fn quit(&mut self) { println!("quitting"); /* ... */ }
}
fn main() {
let mut e = E { key_map: HashMap::new() };
e.map_key('q', Box::new(|e: &mut E| e.quit()));
match e.key_map.get(&'q') {
Some(f) => f(&mut e),
None => {}
}
}
に渡そうとしているため、コンパイルされません:e
f
も不変として借りられる
e
ため、可変として借りることはできませんe.key_map
しかし、 の借用がe.key_map
終了すると、 にアクセスできなくなりますf
。では、マップ内にあるクロージャーを正確に呼び出すにはどうすればよいでしょうか?