是否可以创建一个宏来实现构建器模式方法?

时间:2016-07-02 08:33:35

标签: rust

我为我的结构实现了builder pattern

pub struct Struct {
    pub grand_finals_modifier: bool,
}
impl Struct { 
    pub fn new() -> Struct {
        Struct {
            grand_finals_modifier: false,
        }
    }

    pub fn grand_finals_modifier<'a>(&'a mut self, name: bool) -> &'a mut Struct {
        self.grand_finals_modifier = grand_finals_modifier;
        self
    }
}

在Rust中是否可以为这样的方法创建一个宏来概括并避免大量的重复代码?我们可以使用的东西如下:

impl Struct {
    builder_field!(hello, bool);
}     

2 个答案:

答案 0 :(得分:4)

在阅读the documentation后,我已经提出了这段代码:

macro_rules! builder_field {
    ($field:ident, $field_type:ty) => {
        pub fn $field<'a>(&'a mut self,
                          $field: $field_type) -> &'a mut Self {
            self.$field = $field;
            self
        }
    };
}

struct Struct {
    pub hello: bool,
}
impl Struct {
    builder_field!(hello, bool);
}

fn main() {
    let mut s = Struct {
        hello: false,
    };
    s.hello(true);
    println!("Struct hello is: {}", s.hello);
}

它完全符合我的需要:创建一个具有指定名称,指定成员和类型的公共构建器方法。

答案 1 :(得分:0)

要补充已经接受的答案,因为它已经有4年了,所以您应该签出箱子rust-derive-builder。它使用过程宏自动为任何结构实现构建器模式。