#default #default-value #macro #utility #no-std

no-std inline_default

用于实现结构体中内联默认值的宏

3 个稳定版本

1.2.0 2023年2月24日
1.1.0 2023年1月3日
1.0.0 2022年8月12日

Rust 模式 中排名 #2102

每月下载 24

MIT/Apache

7KB

Inline Default

一个用于在结构体定义中实现 Default 的宏。当在结构体定义中指定默认值比将它们分开更简洁时很有用,例如具有大量字段的结构体,或者当需要构建许多结构体时。例如,

use inline_default::inline_default;

inline_default! {
struct KeyMap {
    left:   char = 'h',
    down:   char = 'j',
    up:     char = 'k',
    right:  char = 'l',

    // uses bool::default(),
    flag:   bool, 
    
    // any constant-time expression is allowed
    qwerty: bool = Keyboard::IS_QWERTY,
}}

展开为

struct KeyMap {
    left:   char,
    down:   char,
    up:     char,
    right:  char,
    flag:   bool,
    qwerty: bool,
}

impl Default for KeyMap {
    fn default() {
        KeyMap {
            left:  'h',
            down:  'j',
            up:    'k',
            right: 'l',
            flag:  bool::default(),
            qwerty: Keyboard::IS_QWERTY,
        }
    }
}

支持

  • 可见性指定符
  • 如果没有指定则使用 Default
  • 结构和字段的属性(包括派生)
  • 结构和字段的文档注释
  • 每个宏中的多个结构体定义
  • 生命周期和泛型,但有主要限制

由于解析特质界限的复杂性,只接受没有泛型的单个特质界限。不支持 where 子句。接受指定生命周期,但不接受 'outlives' 语法 'a: 'b。例如,以下是被接受的,

use inline_default::inline_default;

inline_default! {
/// Example struct
#[derive(Copy, Clone)]
pub(crate) struct Example<'a, T: Default> {
    pub a: &'a str = "example",

    /// field b
    b: T,
}}

但是以下不被接受

use inline_default::inline_default;

// NOT VALID - too many trait bounds on T
inline_default! {
struct Example1<T: Default + Copy> {
    a: T,
}}

// NOT VALID - Traits bounds cannot be generic
inline_default! {
struct Example2<T: From<f32>> {
    a: T = T::from(0.0),
}}

// NOT VALID - outlives syntax is not supported
inline_default! {
struct Example2<'a, 'b: 'a> {
    a: &'a str = "test",
    b: &'b str = "test2",
}}

过程宏?

制作一个过程宏将具有更全面的功能,但我没有这个兴趣。

无运行时依赖