#面向对象 #OOP #

roopert

另一个 Rust 的面向对象工具集

2 个不稳定版本

0.2.0 2021 年 12 月 3 日
0.1.0 2021 年 12 月 3 日

#950Rust 模式

MIT 许可证

13KB

roopert

Roopert 是一个面向对象编程模式的开源工具集。减少编写样板代码的时间,更多时间用于实现功能!

属性

parent extends accessors get set

parent

用于指示与 extends 属性宏结合使用的结构体中哪个字段是父字段的一个字段级属性。此属性宏不接受其他参数。可以使用标准形式 #[roopert(parent)] 以及缩写形式 #[parent] 宏。自动解析类型到字段,但 parent 属性将覆盖默认行为。

extends

用于使具有名称的结构体“扩展”另一个 Rust 类型的功能的结构体级属性。将 Rust 类型作为参数提供,以指示结构体扩展哪些类型。结构体中必须也存在具有相同类型的字段。使用标准形式 #[roopert(extends)] 属性宏,并且可以在字段上使用 #[roopert(parent)] 属性来显式声明父类型。

通过自动实现应用于此属性的结构体的 AsRefAsMutIntoDerefDerefMut,实现了扩展或类似继承的行为。这创建了智能指针行为,并能够显式地进行向下转换。

#[roopert(extends, String)]
struct MyStruct {
    not_parent_field: String, // ignored

    #[roopert(parent)]
    parent_field: String,

    another_field: String, // also ignored
}

// automatically generated AsRef implementation by Roopert
// (not shown: AsMut, Into, Deref, and DerefMut implementations)
impl AsRef<String> for MyStruct {
    fn as_ref(&self) -> &String {
        &self.parent_field
    }
}

accessors

一个用于自动为命名结构体的字段创建获取器和设置器的结构体级别属性。此属性可以接受一个或两个参数(顺序不限):get = ruleset = rule,其中 rule 可以是以下之一:All(生成所有访问器)、Private(为所有私有字段生成访问器)、No(不生成,默认)。此外,get 和 set 属性类型可以用来覆盖结构体级别的获取器和设置器规则。

#[roopert(accessors, get = All)]
struct MyStruct {
    #[roopert(set)]
    my_field: String
}

// automatically generated by Roopert
impl MyStruct {
    // generated from get rule in struct attribute
    pub fn get_my_field(&self) -> &String {
        &self.my_field
    }

    // generated from field attribute
    pub fn set_my_field(&mut self, x: String) {
        self.my_field = x;
    }
}

get

一个字段级别属性,用于覆盖获取器方法的访问器属性行为。可以提供 pre = operation 来在 get 函数返回之前执行操作。可以提供可选参数 mutable = true 来获取一个可变引用(以及允许使用 pre 参数进行可变 self 操作)。标准形式为 #[roopert(get)] 或简化的 #[get] 属性宏。**注意**:没有在结构体上使用 #[roopert(accessors)] 则此功能不可用。

#[roopert(accessors)]
struct MyStruct {
    #[roopert(get, mutable = true, pre = self.before_get_my_field() )]
    my_field: String,
    my_field_is_borrowed: bool
}

impl MyStruct {
    fn before_get_my_field(&mut self) { // note that this function uses `&mut self` because mutable = true
        self.my_field_is_borrowed = true;
    }
}

// automatically generated by Roopert
impl MyStruct {
    // generated from get rule in field attribute
    pub fn get_my_field(&mut self) -> &mut String {
        self.before_get_my_field(); // from `pre = self.pre_get_my_field()`
        &mut self.my_field
    }
}

set

一个字段级别属性,用于覆盖设置器方法的访问器属性行为。可以提供 pre = operationpost = operation 来分别在变量设置之前和之后执行操作。标准形式为 #[roopert(set)] 或简化的 #[set] 属性宏。**注意**:没有在结构体上使用 #[roopert(accessors)] 则此功能不可用。

#[roopert(accessors)]
struct MyStruct {
    #[roopert(set, pre = self.before_set_my_field(), post = self.after_set_my_field())]
    my_field: String,
    setting_my_field: bool, // this will briefly be true (but unobservable unless you break Rust safety)
}

impl MyStruct {
    fn before_set_my_field(&mut self) { // these can always use &mut self, unlike getters
        self.setting_my_field = true;
    }

    fn after_set_my_field(&mut self) {
        self.setting_my_field = false;
    }
}

// automatically generated by Roopert
impl MyStruct {

    // generated from field attribute
    pub fn set_my_field(&mut self, x: String) {
        self.my_field = x;
    }
}

许可证:MIT

依赖项

约 230KB