self
にある任意の値と一致させる必要があり、一致する場合はself
のメソッドを呼び出して、self
を変更します。私はかなり高性能のゲームをやろうとしていますので、私はこのような状況では不可能です。つまり、メソッドは実際に構造体にアクセスする必要があります。構造体のプロパティに基づいてディスパッチされます。ここにMVCEがあります:Rustでプロパティにアクセスした後に&mut selfを呼び出すメソッド
enum Baz {
A,
B,
C,
}
struct Foo {
bar: Option<Baz>,
}
impl Foo {
pub fn dostuff(&mut self, fizz: i32) {
if let Some(ref b) = self.bar {
match b {
&Baz::A => self.do_a(fizz),
&Baz::B => self.do_b(fizz + 2),
&Baz::C => self.do_c(fizz + 1),
}
}
}
pub fn do_a(&mut self, f: i32) {
println!("A, with fizz {}", f);
}
pub fn do_b(&mut self, f: i32) {
println!("B, with fizz {}", f);
}
pub fn do_c(&mut self, f: i32) {
println!("C, with fizz {}", f);
}
}
fn main() {
let foo = Foo { bar: Some(Baz::A) };
foo.dostuff(3);
}
ここにはthe playgroundです。
error[E0502]: cannot borrow `*self` as mutable because `self.bar.0` is also borrowed as immutable
--> src/main.rs:14:28
|
12 | if let Some(ref b) = self.bar {
| ----- immutable borrow occurs here
13 | match b {
14 | &Baz::A => self.do_a(fizz),
| ^^^^ mutable borrow occurs here
...
18 | }
| - immutable borrow ends here
私はボローチェッカーで自分の平和を作ったが、どうやらないと思った。なぜこれが起こっている私が知っていますが、私は、この問題を解決する方法は考えています。誰かが将来これを避ける方法を説明したら、私はそれを感謝します。
"アクセスした後に"アクセスしただけでなく、その参照を保持した後 "プロパティにアクセスした後"。 'do_a' /' do_b'/'do_c'が' self.b'を変更しようとすると、不変な参照が変更されたため、Rustのメモリ安全ルールに違反します。 – Shepmaster