下記のコードは、HashMapより参照を取得しようとし、無い場合はデータを生成して挿入した後に参照を取得する、という関数です。Meta
が重いオブジェクトの場合に用いられそうな構文です。
rust
1pub struct Asker { 2 cache: HashMap<U256, Meta>, 3} 4 5impl Asker { 6 fn get_ref(&mut self, hash: &U256, tasks: &Tasks) -> Result<&Meta, String> { 7 match self.cache.get(hash) { 8 Some(meta) => Ok(meta), 9 10 None => match tasks.get_data(hash)? { 11 Some(data) => { 12 let meta= Meta::from(data); 13 self.cache.insert(hash.clone(), meta); 14 15 if 100 <= self.cache.len() { 16 let (delete_hash, _) = self 17 .cache 18 .iter() 19 .min() 20 .unwrap(); 21 let delete_hash = delete_hash.clone(); 22 self.cache.remove(&delete_hash); 23 } 24 25 Ok(self.cache.get(&hash).unwrap()) 26 }, 27 None => Err("failed".to_owned()), 28 }, 29 } 30 } 31}
これは借用チェッカーによりエラーになります。optionでnoneが返される部分のブロックではsomeでの借用は影響されないはずです。しかし、下記のエラーを読み取ると影響があるように思われます。
error
1error[E0502]: cannot borrow `self.cache` as mutable because it is also borrowed as immutable 2 --> src\nice\man.rs:79:25 3 | 452 | fn get_ref(&mut self, hash: &U256, tasks: &Tasks) -> Result<&Meta, String> { 5 | - let's call the lifetime of this reference `'1` 6 | 754 | match self.cache.get(hash) { 8 | ---------- immutable borrow occurs here 955 | Some(meta) => Ok(meta), 10 | ---------- returning this value requires that `self.cache` is borrowed for `'1` 11... 1279 | self.cache.remove(&delete_hash); 13 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here
この借用の範囲について、またはエラーの回避方法について何かわかる方は回答の方をよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/11 07:28