1个不稳定版本
0.1.0 | 2020年3月20日 |
---|
#18 in #integral
22KB
456 行
为新类型ID提供基本整数操作。
许可证
id-derive
以MIT许可证和Apache许可证(版本2.0)的条款分发。
有关详细信息,请参阅LICENSE-APACHE和LICENSE-MIT。
lib.rs
:
该crate的目标是提供不同类型强类型标识符的简单新类型实现。
动机
我经常发现自己使用许多基于整数的ID。为了使其强类型化,通常使用“新类型”模式。
struct MyId(usize);
let id = MyId(1);
assert_eq!(id.0, 1);
assert_eq!(MyId(id.0 + 10).0, MyId(11).0);
请注意,每次您想对实际整数执行任何类型的操作时,都必须使用.0
来访问元组元素。可以通过实现Deref
特质来解决这个问题,但这被强烈反对;请参阅:Rust 文档,API 指南。
此crate引入了一套宏,用于在ID上执行某些操作。
示例
在最简单的情况下,您只需要一个单个的 derive Id
。
#[derive(Id, Debug, PartialEq, Copy, Clone)]
struct MyId(usize);
// Construct from the inner type.
let mut id = MyId::from(1);
// Construct inner type from `MyId`.
assert_eq!(usize::from(id), 1);
// Display.
assert_eq!(&id.to_string(), "1");
// Add two IDs or inner to ID.
assert_eq!(id + MyId(1), MyId(2));
assert_eq!(id + 1, MyId(2));
id += 1;
id += MyId(1);
assert_eq!(id, MyId(3));
// Subtract
assert_eq!(id - MyId(1), MyId(2));
assert_eq!(id - 1, MyId(2));
id -= 1;
id -= MyId(1);
assert_eq!(id, MyId(1));
// Multiply
assert_eq!(id * MyId(2), MyId(2));
assert_eq!(id * 2, MyId(2));
id *= 2;
id *= MyId(2);
assert_eq!(id, MyId(4));
// Divide
assert_eq!(id / MyId(2), MyId(2));
assert_eq!(id / 2, MyId(2));
id /= 2;
id /= MyId(2);
assert_eq!(id, MyId(1));
或者,您可能只需要定义可用的派生子集
#[derive(Display, FromInner, IntoInner, Add, AddInner)]
struct MyId(usize);
依赖项
~1.5MB
~35K SLoC