#structs #struct #macro #no-alloc

no-std non-exhaustive

允许非穷尽结构体表达式的宏

2 个版本

0.1.1 2024年2月25日
0.1.0 2024年2月24日

#53 in #structs

MIT/Apache

9KB

non-exhaustive

CI Status Crates.io Docs.rs Documentation for main

宏用于创建非穷尽结构体和具有私有字段的非穷尽结构体,使用功能更新语法,即使用 ..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
};

无运行时依赖