Is there a way to create a constant from an enum value in a box?

Create a box:

cargo new --lib constenum

Src / lib.rs

#[repr(u16)]
pub enum MyEnum {
    ONE = 1,
    TWO = 2,
}
pub const CRATE_ONE: u16        = MyEnum::ONE as u16;
pub const CRATE_TWO: u16        = MyEnum::TWO as u16;

tests /lib.rs

extern crate constenum;

#[test]
fn f() {
    let test_x = [0; constenum::CRATE_TWO as usize];
    // the above causes a compile error below

    // error[E0080]: constant evaluation error
    //    --> src/lib.rs:7:28
    //    |
    // 10 |
    //    |                              ^^^^^^^^^^^^^ unimplemented constant expression: enum variants
    //    |
    // note: for repeat count here
    //     --> tests/lib.rs:5:22
    //    |
    // 5  |     let test_x = [0; constenum::CRATE_TWO as usize];
    //    |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}

If I put the same code in examples / main.rs , which is very similar to tests but does not use a box, it succeeds:

#[repr(u16)]
pub enum ExampleEnum {
    ONE = 1,
    TWO = 2,
}
pub const EXAMPLE_ONE: u16      = ExampleEnum::ONE as u16;
pub const EXAMPLE_TWO: u16      = ExampleEnum::TWO as u16;

fn main() {
    let example_x = [0; EXAMPLE_TWO as usize];
}
+4
source share

Source: https://habr.com/ru/post/1665964/


All Articles