8 个版本
使用旧 Rust 2015
0.3.0 | 2021年8月21日 |
---|---|
0.2.0 | 2019年12月24日 |
0.1.5 | 2019年3月10日 |
0.1.2 | 2018年10月23日 |
0.0.2 | 2018年9月15日 |
在 Rust 模式 中排名 #491
每月下载量 812,450
用于 223 个 软件包(直接使用 28 个)
16KB
120 行
nonzero_ext
用于表示泛型非零整数类型的特性
Rust 现在提供了非零整数类型,这使得程序员可以承诺(节省内存!)一个数字永远不会为零。这很好,但遗憾的是,标准库并没有提供很多工具来帮助您方便地使用它们。
非零常量字面量的宏
创建和处理常量字面量很方便,但标准库(目前还有 rust 解析器)没有提供方便地从常量字面量创建 num::NonZeroU*
类型值的便利。这个软件包提供了一个 nonzero!
宏,允许您编写 nonzero!(20u32)
,这将在编译时检查正在转换的常量是否为非零,而不是繁琐的(并在运行时检查的!)NonZeroU32::new(20).unwrap()
。
泛型非零特性
stdlib 的 num::NonZeroU*
类型没有实现任何公共特性(它们的可置零等效类型也没有)。当标准库中缺少这些特性时,如果想要编写一个函数,该函数接受一个整数向量,并返回一个相应的非零整数类型的向量,其中不包括原始向量中的零元素,这时就会出现问题。
fn only_nonzeros(v: Vec<u8>) -> Vec<NonZeroU8>
{
v.into_iter()
.filter_map(|n| NonZeroU8::new(n))
.collect::<Vec<NonZeroU8>>()
}
let expected: Vec<NonZeroU8> = vec![nonzero!(20u8), nonzero!(5u8)];
assert_eq!(expected, only_nonzeros(vec![0, 20, 5]));
但如果你想让这个函数能够与任何具有相应非零类型的整数类型一起工作呢?这个软件包可以提供帮助。
fn only_nonzeros<I>(v: Vec<I>) -> Vec<I::NonZero>
where
I: Sized + NonZeroAble,
{
v.into_iter()
.filter_map(|n| n.as_nonzero())
.collect::<Vec<I::NonZero>>()
}
// It works for `u8`:
let input_u8: Vec<u8> = vec![0, 20, 5];
let expected_u8: Vec<NonZeroU8> = vec![nonzero!(20u8), nonzero!(5u8)];
assert_eq!(expected_u8, only_nonzeros(input_u8));
// And it works for `u32`:
let input_u32: Vec<u32> = vec![0, 20, 5];
let expected_u32: Vec<NonZeroU32> = vec![nonzero!(20u32), nonzero!(5u32)];
assert_eq!(expected_u32, only_nonzeros(input_u32));
许可:Apache-2.0