18个版本

0.7.6 2022年11月1日
0.6.4 2022年2月3日
0.6.2 2021年12月27日
0.4.1 2021年11月13日

#1144 in Rust模式

Download history 8/week @ 2024-03-11 4/week @ 2024-03-18 50/week @ 2024-03-25 22/week @ 2024-04-01 54/week @ 2024-04-08 48/week @ 2024-04-15 112/week @ 2024-04-22 99/week @ 2024-04-29 121/week @ 2024-05-06 42/week @ 2024-05-13 115/week @ 2024-05-20 70/week @ 2024-05-27 43/week @ 2024-06-03 47/week @ 2024-06-10 80/week @ 2024-06-17 93/week @ 2024-06-24

265 每月下载量
用于 bangumi

MIT 许可证

18KB
121

microtype

无样板微类型

是什么/为什么/怎么做?

微类型(也称为“新类型”)是原始类型上的薄包装,根据它们的用途/含义区分两个本质上相同的类型。由于它们是不同的类型,因此不能互相替换。这有助于通过在编译时捕获数据的不正确使用来减少逻辑错误。

例如,考虑以下

fn handle_order(user_id: String, order_id: String) {
  // ...
} 

fn main() {
  let user_id = ...;
  let order_id = ...;
  handle_order(order_id, user_id);
}

在这个小型示例中,很容易看出这里有一个错误: order_iduser_id 的顺序是错误的。然而,随着项目的增长,这变得越来越难发现。更普遍的是,人类在检测此类错误方面并不擅长,因此我们应该尝试将这项工作转嫁给编译器。

让我们来看看这个示例,但使用微类型代替

// microtype definitions
microtype! {
  String {
    UserId
  }

  String {
    OrderId
  }
}

// or use the shorthand for declaring multiple microtypes
// microtype! {
//   String {
//     UserId
//     OrderId
//   }
// }

fn handle_order(user_id: UserId, order_id: OrderId) {
  // ...
} 

fn main() {
  let user_id: UserId = ...;
  let order_id: OrderId = ...;
  handle_order(order_id, user_id);  // Error, mismatched types
}

太棒了!它无法编译。通过引入微类型,我们已经将这个运行时错误转换为编译时错误。

有关更多详情和示例,请参阅文档

贡献

欢迎所有和任何的贡献!请随时提出问题/提交PR等。

依赖关系

~1.5MB
~36K SLoC