要素がベクトル内の最後の要素よりも大きい場合にのみ、並べ替えられたベクトルの末尾に要素をプッシュする関数を作成しようとしています。それ以外の場合は、最大の要素への参照でエラーを返します。私が知る限り、これは借用規則に違反しているようには見えませんが、借用チェッカーはそれを好まないのです。理由がわかりません。
struct MyArray<K, V>(Vec<(K, V)>);
impl<K: Ord, V> MyArray<K, V> {
pub fn insert_largest(&mut self, k: K, v: V) -> Result<(), &K> {
{
match self.0.iter().next_back() {
None => (),
Some(&(ref lk, _)) => {
if lk > &k {
return Err(lk);
}
}
};
}
self.0.push((k, v));
Ok(())
}
}
error[E0502]: cannot borrow `self.0` as mutable because it is also borrowed as immutable
--> src/main.rs:15:9
|
6 | match self.0.iter().next_back() {
| ------ immutable borrow occurs here
...
15 | self.0.push((k, v));
| ^^^^^^ mutable borrow occurs here
16 | Ok(())
17 | }
| - immutable borrow ends here
なぜこれが機能しないのですか?
パオロ・ファラベラの答えに応えて。
次のように、return ステートメントのある関数を return ステートメントのない関数に変換できます。
fn my_func() -> &MyType {
'inner: {
// Do some stuff
return &x;
}
// And some more stuff
}
の中へ
fn my_func() -> &MyType {
let res;
'outer: {
'inner: {
// Do some stuff
res = &x;
break 'outer;
}
// And some more stuff
}
res
}
このことから、借用が のスコープを超えて存続することが明らかになり'inner
ます。
ボローチェックの目的で代わりに次の書き換えを使用することに問題はありますか?
fn my_func() -> &MyType {
'outer: {
'inner: {
// Do some stuff
break 'outer;
}
// And some more stuff
}
panic!()
}
return ステートメントは、それ以外の場合は借用規則に違反する可能性のあるその後の発生を排除することを考慮してください。