Rust 中类似 Java 枚举的行为

Cas*_*eyB 2 enums rust

我想要一个枚举,其中枚举中的每个值都存储表示颜色的 RGBA 值的常量字节数组。在Java中我会这样做:

public enum Color {
    BLACK([0x0C, 0x00, 0x05, 0xFF]),
    BLUE([0x00, 0x2D, 0xFF, 0xFF]),
    RED([0xFF, 0x3E, 0x00, 0xFF]);

    private final byte[] rgba;

    Color(byte[] rgba) {
      this.rgba = rgba;
    }

    public int[] value() {
      return rgba;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以传递 Color 类型并仅使用 color.value() 来获取字节。这就是我在 Rust 中所拥有的:

struct Color;

impl Color {
    pub const BLACK: [u8; 4] = [0x0C, 0x00, 0x05, 0xFF];
    pub const BLUE: [u8; 4] = [0x00, 0x2D, 0xFF, 0xFF];
    pub const RED: [u8; 4] = [0xFF, 0x3E, 0x00, 0xFF];
}
Run Code Online (Sandbox Code Playgroud)

但这意味着我想传递 Color 的任何地方,类型都是[u8; 4]。我可以调用 structColors然后执行pub type Color = [u8; 4]. 那么你可以有这样的类型Color,但这样就会看起来Colors::BLACK很奇怪。

Sir*_*ius 7

如果您希望Color结构体中的字节数组具有强类型,则可以使用以下表示法,称为元组结构体

struct Color([u8; 4]);

impl Color {
    pub const BLACK: Color = Color([0x0C, 0x00, 0x05, 0xFF]);
    pub const BLUE: Color = Color([0x00, 0x2D, 0xFF, 0xFF]);
    pub const RED: Color = Color([0xFF, 0x3E, 0x00, 0xFF]);
}

fn main() {
    // classic way of accessing data
    println!("{:?}", Color::BLACK.0);
    
    // using destructuring
    let Color(bytes) = Color::BLUE;
    println!("{:?}", bytes);
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接