別の理由でエラー メッセージが表示されます。可変でない変数parent
があり、それに を作成しようとして&mut
います。あなたが得ることを修正する
let mut parent = Parent {
used: 0,
child: Child {
dummy: 1
}
};
parent.child.use_parent(&mut parent);
および対応するエラー
<anon>:31:34: 31:40 error: cannot borrow `parent` as mutable more than once at a time
<anon>:31 parent.child.use_parent(&mut parent);
^~~~~~
<anon>:31:5: 31:17 note: previous borrow of `parent.child` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `parent.child` until the borrow ends
<anon>:31 parent.child.use_parent(&mut parent);
^~~~~~~~~~~~
<anon>:31:41: 31:41 note: previous borrow ends here
<anon>:31 parent.child.use_parent(&mut parent);
^
あなたはほぼ正しい結論を導き出しました。
親を変更しても子が消えないことを証明する必要があります
そうではありません。あなたは子供に2つ&mut
または1つと1つを決して持たないことを証明する必要があります. 親に がある場合は、それを使用して子に を取得できます。したがって、親に aを、子に a を指定すると、子に 2 つを指定できます。&mut
&
&mut
&mut
&mut
&mut
&mut
私が見る唯一の解決策は、use
関数を型に移動してthroughParent
にアクセスすることです。child
self
impl Parent {
fn use_parent(&mut self) {
// use both child and parent
self.used += self.child.dummy;
self.child.dummy += 1;
}
}
コメントへの対応:
残念ながら、解決策はこの単純化された問題には適用されますが、実際の問題には適用されません。親には、深くネストされた孫を持つ可能性のある子のベクトルがあります。私はself.childとは言えません
ベクトルを変更してはならない (変更できない、Rust が保護する) ため、子への参照が無効になるため、それらの部分を必要な関数に渡すことができますが、直接の親である部分はどれも渡せません。子供の。
impl Child {
fn use_parent(&mut self, used: &mut i32) {
// use both child and parent
*used += self.dummy;
self.dummy += 1;
}
}
fn main() {
let mut parent = Parent {
used: 0,
child: Child {
dummy: 1
}
};
// although both point to elements of the same structure
// it is guaranteed at compile-time that they point to
// non-overlapping parts
let child = &mut parent.child;
let used = &mut parent.used;
child.use_parent(used);
}
残念ながら、 のパラメータが同じオブジェクトuse_parent
の一部を指していることを証明する方法がわかりません。Parent
多分それは生涯でできるかもしれませんが、私にはわかりませんが、私はそれに非常に興味があります. 注:Rc
同じ問題があります。