#At-patterns and borrowing

2 messages · Page 1 of 1 (latest)

hexed rock
#

Hello!

match (st /* is &mut of an enum value */, entry) {
        // Other branches
        (st @ DefiningDigOrder { area: Some(_) }, ConfirmOrder) => {

            if let DefiningDigOrder { area } = std::mem::replace(st, Done) {
                se.add_side_effect(SideEffect::MiningOrderCreated(MiningOrder {
                    area: area.unwrap(),
                }));
            } else {
                panic!("Invalid state");
            }

        }
        // Other branches
    }

This compiles, but knowing Rust, there's gotta be a better way, right?

cold gorge
#

if you can't destructure *st (e.g. it's not Copy), best what I came up with is:

    // re-borrow `st`
    match (&mut *st, entry) {
        (DefiningDigOrder { area: Some(area) }, ConfirmOrder) => {
            se.add_side_effect(SideEffect::MiningOrderCreated(MiningOrder { area: *area }));
            *st = Done; // old references are inactive duo to NLL
        }
        // ...
    }