如何安全地初始化一个类型为“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
.
也可以使用它
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
.