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模式
265 每月下载量
用于 bangumi
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_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等。
依赖关系
~1.5MB
~36K SLoC