2 个版本
0.1.1 | 2024年2月25日 |
---|---|
0.1.0 | 2024年2月24日 |
#53 in #structs
9KB
non-exhaustive
宏用于创建非穷尽结构体和具有私有字段的非穷尽结构体,使用功能更新语法,即使用 ..Default::default()
。
给定外部结构体
#[non_exhaustive]
#[derive(Default)]
pub struct NonExhaustive {
pub field: usize
}
#[derive(Default)]
pub struct PrivateFields {
pub pub_field: usize,
private_field: usize
}
以下是不可能的
NonExhaustive {
field: 1,
..Default::default()
};
PrivateFields {
pub_field: 1,
..Default::default()
};
non_exhaustive!
解决了这个问题
use non_exhaustive::non_exhaustive;
# mod module {#[derive(Default)] pub struct NonExhaustive {pub field: usize, _hack: usize} #[derive(Default)] pub struct PrivateFields { pub pub_field: usize, private_field: usize}} use module::*;
non_exhaustive! {NonExhaustive {
field: 1,
..Default::default()
}};
non_exhaustive! {PrivateFields {
pub_field: 1,
..Default::default()
}};
对于使用 Default::default()
的常见情况,non_exhaustive!
允许省略 .. 表达式
use non_exhaustive::non_exhaustive;
# mod module {#[derive(Default)] pub struct NonExhaustive {pub field: usize, _hack: usize} #[derive(Default)] pub struct PrivateFields { pub pub_field: usize, private_field: usize}} use module::*;
non_exhaustive!(NonExhaustive { field: 1 });
non_exhaustive!(PrivateFields { pub_field: 1 });
在底层,non_exhaustive!
非常简单,它展开为
# mod module {#[derive(Default)] pub struct NonExhaustive {pub field: usize, _hack: usize}} use module::*;
{
let mut value: NonExhaustive = Default::default();
value.field = 1;
value
};