私は、借りようとしている間に不変の借りをしているとRustが告げるところで永続的なコンパイルエラーが出ますが、不変の借りは別のスコープから来ています。HashMapのRust Borrowは、それが入っているスコープを超えていますか?
私はマップ内の値をチェックするコードを持っています。コードが存在する場合はそれを返します。そうでなければマップをさまざまな方法で変更する必要があります。問題は、2つの操作が完全に分離しているにもかかわらず、私が両方をやらせる方法を見つけられないように見えることです。これは、私にはどんな意味がありません
error[E0502]: cannot borrow `*map` as mutable because it is also borrowed as immutable
--> src/main.rs:17:5
|
7 | match map.get(&key) { // borrow immutably
| --- immutable borrow occurs here
...
17 | map.insert(0, 0); // borrow mutably, which errors
| ^^^ mutable borrow occurs here
18 | None
19 | }
| - immutable borrow ends here
:
fn do_stuff(map: &mut BTreeMap<i32, i32>, key: i32) -> Option<&i32> {
// extra scope in vain attempt to contain the borrow
{
match map.get(&key) { // borrow immutably
Some(key) => { return Some(key); },
None =>(),
}
}
// now I'm DONE with the immutable borrow, but rustc still thinks it's borrowed
map.insert(0, 0); // borrow mutably, which errors
None
}
このエラーが出持つ:
は、ここに私のコードと同じ構造に従っており、問題を示すいくつかの無意味なコードです。不変の借り方はどのようにその範囲よりも長く続くのですか?そのmatch
の1つのブランチはreturnを介して関数を終了し、もう1つは何もせずスコープから出ます。
これは私が間違って他の変数のスコープから借りたものを密輸してしまった前に起こっていましたが、ここにはありません!
真実では、借用はreturnステートメントでスコープをエスケープしていますが、そのブロックが関数内でさらに借りることをブロックすることは馬鹿げています。私がそこに何か他のものを返すと、エラーは消えてしまいます。だから私はこれが借りチェッカーがハングアップしていると思います。これは私のバグのように感じます。
残念ながら、私は同じエラーが発生することなくこれを書き換える方法を見つけることができませんでした。その場合、特に厄介なバグです。
残念ながら、.ENTRYは()この関数が行う必要がある何のために右ではありません。私は非字句スコープの問題を認識していますが、通常はその問題を回避することができますが、この場合、どのように重複した作業を行わないものを考え出すことができませんでした回避策は醜いです...また、通常はスコープを追加することで問題を回避できますが、ここではそうではありません。 1つの借りを別の機能に移動しても役立たない。 –