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

的构造函数NonZeroU8是 a const fn,但它返回 an Option,而Option.unwrap()不是 a const fn,因此以下内容不会编译:

use std::num::NonZeroU8;

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

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

use std::num::NonZeroU8;

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

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

回答

fns 中的恐慌const目前是不稳定的,这就是为什么你不能使用unwrap. 一个有点丑陋但稳定的不使用的解决方法unsafe是使用隐式恐慌的东西,比如越界数组索引:

use std::num::NonZeroU8;

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

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

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


以上是如何安全地初始化类型为“NonZeroU8”的常量?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>