match
egy szerkezeten dolgozom, és gyufaőrt szeretnék használni. A struktúra azonban változtatható, és úgy tűnik, hogy az illesztőkar bal oldalán lévő kötési változók külön kölcsönzést okoznak. Ez azután fordítási hibákat vált ki, mivel nem kaphat második kölcsönzést (változatlan vagy megváltoztathatatlan), amíg a módosítható kölcsön még fennáll.
struct A(u8);
impl A {
fn is_awesome(&self) -> bool { true }
}
struct Container(A);
impl Container {
fn update(&mut self) {}
fn do_a_thing(&mut self) {
match *self {
Container(ref a) if a.is_awesome() => self.update(),
_ => {},
}
}
}
fn main() {}
error[E0502]: cannot borrow `*self` as mutable because `self.0` is also borrowed as immutable
--> src/main.rs:14:51
|
14 | Container(ref a) if a.is_awesome() => self.update(),
| ----- ^^^^ mutable borrow occurs here
| |
| immutable borrow occurs here
15 | _ => {},
16 | }
| - immutable borrow ends here
Jelenlegi megoldásom az, hogy megkettőzöm a logikát a meccsőr kiszámításához a meccsem előtt, majd a logikai értéket használhatom meccsőrként. Ez nem elégíti ki a nyilvánvaló kódduplikációs problémákat:
fn do_a_thing(&mut self) {
let awesome = match *self {
Container(ref a) => a.is_awesome(),
};
match *self {
Container(..) if awesome => self.update(),
_ => {},
}
}