如何安全地初始化一个类型为“NonZeroU8”的常量?

How can I safely initialise a constant of type `NonZeroU8`?

NonZeroU8的构造函数是const fn,但returns是Option,而Option.unwrap()不是const fn,所以以下不会编译:

use std::num::NonZeroU8;

const _: NonZeroU8 = NonZeroU8::new(7).unwrap();

我发现的最佳解决方法是:

use std::num::NonZeroU8;

const _: NonZeroU8 = unsafe {NonZeroU8::new_unchecked(7)};

“不安全”的使用令人不满意。有安全的方法吗?

Panicing in const fns 目前不稳定,这就是你不能使用 unwrap 的原因。一个有点丑陋但不使用 unsafe 的稳定解决方法是使用隐含恐慌的东西,比如越界数组索引:

use std::num::NonZeroU8;

const VALUE: NonZeroU8 = match NonZeroU8::new(5) {
    Some(v) => v,
    None => [][0],
};

fn main() {
    println!("Value: {}", VALUE);
}

您可以对此进行测试,注意将 5 更改为 0 将导致编译时错误。值得注意的是,在常量中,new_unchecked 仍然会导致零值的编译时错误,因此尽管 unsafe.

也可以使用它