How to do pattern matching with boxed enum?

77 Views Asked by At

i have an enum where i have to perform pattern matching. But since i am running the program on VM which has limited stack memory ( < 4Kb ), i allocated the enum on the heap using Box. But while performing pattern matching, i have to dereference it which causes it to get allocated on stack which i dont need. Is it possible to perform pattern matching on Boxed values?

I want to achieve something like below.

pub enum MyEnum {
  A,
  B,
}

let a = Box::new(MyEnum::A);
let value = match a {
  MyEnum::A => 1,
  MyEnum::B => 2 
}

This is the error that i get

error[E0308]: mismatched types
   --> src/entrypoint.rs:119:9
    |
118 |     match a {
    |           ---
    |           |
    |           this expression has type `Box<MyEnum>`
    |           help: consider dereferencing the boxed value: `*a`
119 |         MyEnum::A => 1,
    |         ^^^^^^^^^^^^^^^ expected struct `Box`, found enum `MyEnum`
    |
    = note: expected struct `Box<MyEnum>`
                 found enum `MyEnum`

I tried dereferencing it as the compiler suggested, but since it allocated on stack while dereferencing, i could not use it. I want to match the enum without dereferencing it.

1

There are 1 best solutions below

4
Aleksander Krauze On BEST ANSWER

You can match on references too. This will simply reborrow boxed value and allocate at most a pointer on the stack.

pub enum MyEnum {
  A,
  B,
}

let a = Box::new(MyEnum::A);
let value = match &*a {
  &MyEnum::A => 1,
  &MyEnum::B => 2 
};