2 个不稳定版本
0.1.0 | 2024 年 5 月 1 日 |
---|---|
0.0.0 | 2024 年 4 月 10 日 |
1280 在 Rust 模式
82 每月下载量
34KB
571 行
使用
using
宏允许简化构建器模式的使用,无需从构建器方法返回 &mut Self
或 Self
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!");