如何安全地初始化类型为“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.