我想要一个枚举,其中枚举中的每个值都存储表示颜色的 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很奇怪。
如果您希望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)