チップ8エミュレータを作成しようとしていますが、ボローチェッカーが苦労しています。メソッドポインタをHashMapに格納して呼び出す方法
アイデアはHashMap
内のメソッドポインタを検索し、このメソッドポインタを実行してオペコードをデコードすることですが、私は正常に動作するように変更可能なメソッドのポインタを取得することはできません:ポインタを使用して
struct Chip8 {
opcode: u16,
//... other fields
jump_table: HashMap<u16, Box<fn(&mut Chip8)>>,
}
の機能:
fn execute_decoded(&mut self, key: u16) {
let func = self.jump_table.get(&key);
match func {
Some(func) => func(self),
None => {
println!("invalid op: {}", self.opcode);
sleep(Duration::from_millis(10000));
return;
}
}();
self.program_counter = self.program_counter + 2;
}
チェッカーは文句:
cannot borrow `*self` as mutable because `self.jump_table` is also borrowed as immutable
--> main.rs:168:36
|
165 | let func = self.jump_table.get(&key);
| --------------- immutable borrow occurs here
...
168 | Some(func) => func(self),
| ^^^^ mutable borrow occurs here
...
178 | }
| - immutable borrow ends here
このエラーがなぜ起こっているのか分かりません。
self.jump_table.get(&key)
はなぜ借りるのですか? execute_decoded
の署名に基づいて、私はそれがself
の変更可能な借用バージョンで動作し、追加の借用は必要ないと仮定していました。
、コンパイラは 'func'は、などによって変更*それが無効になるように' self'、*しないという保証はありませんハッシュマップをクリアします。 – Shepmaster