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
336 每月下载量
在 2 个crate中使用 (通过 microtype)
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_id
和 user_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