14次发布

0.2.6 2022年11月1日
0.2.5 2022年8月22日
0.1.6 2022年2月3日
0.1.5 2022年1月1日
0.1.4 2021年12月27日

#65#newtype

Download history 93/week @ 2024-04-25 117/week @ 2024-05-02 69/week @ 2024-05-09 98/week @ 2024-05-16 83/week @ 2024-05-23 60/week @ 2024-05-30 53/week @ 2024-06-06 40/week @ 2024-06-13 92/week @ 2024-06-20 87/week @ 2024-06-27 48/week @ 2024-07-04 55/week @ 2024-07-11 27/week @ 2024-07-18 97/week @ 2024-07-25 108/week @ 2024-08-01 96/week @ 2024-08-08

336 每月下载量
2 个crate中使用 (通过 microtype)

MIT 许可证

34KB
919

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,等等。


lib.rs:

microtype 的过程宏crate

依赖关系

~1.5MB
~35K SLoC