#pattern #derive #with #withers

withers_derive

为结构体属性实现wither方法的宏

2个不稳定版本

使用旧Rust 2015

0.2.0 2018年4月2日
0.1.0 2018年4月2日

#8 in #with

MIT许可证

6KB
51

Withers Derive

Latest Version

一个用于为结构体属性实现wither方法的宏。

Wither模式

Wither模式包括使用方法来修改结构体实例,通常以with_开头。

#[derive(Withers, Default)]
struct Foo {
    bar: u32,
    baz: Option<bool>
}

fn main() {
    let instance = foo::default()
        .with_bar(32)
        .with_baz(Some(false));
}

此实现生成消耗方法,因此实例被修改和消耗,并且不能再以先前状态使用。

Wither与Builder的比较

尽管Wither模式与Builder模式相似,但

  • Wither模式不需要单独的结构体。
  • Wither模式允许轻松修改现有实例(这与clone和/或copy一起很有用)。
  • Wither模式不会导致由于未初始化属性而导致的运行时错误。

然而

  • Wither模式要求结构体能够使用默认和合理的值进行初始化。否则,在初始化时可能会捕获的错误可能会在以后导致意外的行为。
  • Builder通常可以存储并用于生成结构体的多个实例,而withers直接操作实例。

如果您觉得这些问题可能对您有问题,那么derive_builder crate可能更适合您的需求。

它的作用

以下代码

#[macro_use]
extern crate withers_derive;

#[derive(Withers)]
struct Foo {
   bar: u32,
   baz: Option<bool>
}

将生成类似以下代码

struct Foo {
    bar: u32,
    baz: Option<bool>
}

#[allow(dead_code)]
impl Foo {
    fn with_bar(mut self, value: u32) -> Self {
        self.bar = value;
        self
    }

    fn with_baz(mut self, value: Option<bool>) -> Self {
        self.baz = value;
        self
    }
}

快速入门

  • wither_derive依赖项添加到您的Cargo.toml文件中。
  • 导入crate和宏
#[macro_use]
extern crate withers_derive;
  • 使用#[derive(Withers)]注释结构体。

许可证

MIT许可证

贡献

请Fork存储库并将拉取请求提交到master。较大的代码更改应使用GitHub问题进行跟踪。

依赖项

~2MB
~47K SLoC