1个不稳定版本

0.1.0 2020年3月20日

#18 in #integral

Apache-2.0/MIT

22KB
456

为新类型ID提供基本整数操作。

许可证

id-derive 以MIT许可证和Apache许可证(版本2.0)的条款分发。

有关详细信息,请参阅LICENSE-APACHELICENSE-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