#builder #builder-pattern #macro #methods #cascading

无需 std 使用

一个用于简化具有方法级联的构建器的宏

2 个不稳定版本

0.1.0 2024 年 5 月 1 日
0.0.0 2024 年 4 月 10 日

1280Rust 模式

Download history 103/week @ 2024-04-26 23/week @ 2024-05-03 2/week @ 2024-06-28 7/week @ 2024-07-05

82 每月下载量

MIT 许可证

34KB
571

使用

Crates.io Version docs.rs Crates.io License

using 宏允许简化构建器模式的使用,无需从构建器方法返回 &mut SelfSelf

let vec3 = using!(Vec3Builder::default() => {
    .x(4.27);
    .y(9.71);
    .z(13.37);
    .build()
});

#[derive(Default, Debug, Copy, Clone)]
struct Vec3Builder {
    x: Option<f32>,
    y: Option<f32>,
    z: Option<f32>,
}

impl Vec3Builder {
    pub fn x(&mut self, x: f32) {
        self.x = Some(x);
    }

    pub fn y(&mut self, y: f32) {
        self.y = Some(y);
    }

    pub fn z(&mut self, z: f32) {
        self.z = Some(z);
    }

    //this also works with `self` instead of `&mut self`
    pub fn build(&mut self) -> Vec3 {
        Vec3 {
            x: self.x.unwrap(),
            y: self.y.unwrap(),
            z: self.z.unwrap(),
        }
    }
}

#[derive(Debug, Copy, Clone)]
struct Vec3 {
    x: f32,
    y: f32,
    z: f32,
}

using 宏允许对同一对象调用多个方法,这也称为 方法级联。在上面的示例中,以下代码被生成

let vec3 = {
    let mut target = Vec3Builder::default();
    target.x(4.27);
    target.y(9.71);
    target.z(13.37);
    target.build()
};

这允许更灵活地实现和使用构建器,并使更复杂的用例更加易于使用

// "Conventional" builder with method chaining:

let mut builder = SomeBuilder::new()
    .x(...)
    .y(...);
if some_condition {
    builder.z(...);
}
if some_other_condition {
    some_function(&mut builder);
}
let thing = builder.build();



// Using Builder with `using`:

let thing = using!(builder @ SomeBuilder::new() => {
    .x(...);
    .y(...);
    if some_condition {
        .z(...);
    }
    if some_other_condition {
        some_function(&mut builder);
    }
    .build()
});

虽然 using 主要为构建器模式设计,但它并不局限于这一点,因为它可以用于几乎任何类型

let hello_world = using!(Vec::new() => {
    .push("Hello");
    .push("World!");
    .join(", ")
});
assert_eq!(hello_world, "Hello, World!");

无运行时依赖