相当于 NonZeroU8,但不是 0,而是使用 u8::MAX?

5 rust

我希望能够使用Option<NonZeroU8>其紧凑的 repr,但仍然能够使用 0。

有没有办法使用u8::MAX不可表示的值而不是 0?

kmd*_*eko 3

有一个nonmax板条箱可以提供此功能。NonMaxU8具体看。这是有效的,因为它在内部使用NonZeroU8并在创建和方法时进行适当的转换.get()


如果您想要不同的变体,而不仅仅是零或最大,您可以轻松制作自己的变体。nonmax 板条箱使用 XOR 策略将不可表示的值清零或使用模块化算术方法,如评论中建议的那样:

pub struct NonTenU8(NonZeroU8);

impl NonTenU8 {
    const UNREPRESENTABLE: u8 = 10;

    /// Creates a u8 value that cannot be ten.
    pub fn new(value: u8) -> Option<Self> {
        NonZeroU8::new(value ^ Self::UNREPRESENTABLE).map(Self)
        // NonZeroU8::new(value.wrapping_sub(Self::UNREPRESENTABLE)).map(Self)
    }

    pub fn get(&self) -> u8 {
        self.0.get() ^ Self::UNREPRESENTABLE
        // self.0.get().wrapping_add(Self::UNREPRESENTABLE)
    }
}
Run Code Online (Sandbox Code Playgroud)