我需要匹配來自方法的self
上的可選值,並基於該匹配,調用self
上的方法,該方法可變地取self
。我試圖做一個相當高性能的遊戲,所以儘量避免可變性,我不能在這種情況下:方法確實需要可變地訪問結構,他們確實需要根據結構屬性進行調度。這是一個MVCE:訪問Rust中訪問屬性後調用方法
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