4个版本 (2个破坏性更新)

0.3.0 2024年5月29日
0.2.0 2024年5月26日
0.1.1 2024年5月25日
0.1.0 2024年5月25日

#1801 in 过程宏


用于 rombok

MIT 许可证

18KB
260

rombok

GitHub license

类似于lombok的样板代码生成宏。

它通过属性宏自动创建模式实现,例如Getter、Setter和Builder。

Getter

Getter宏为结构的每个字段生成 get_{fieldname}get_{fieldname}_mut 方法。

use rombok::Getter;

#[Getter]
struct Person {
    name: String,
    age: u8,
}

fn main() {
    let person = Person {
        name: "John".to_string(),
        age: 30,
    };

    let name = person.get_name();
    let age = person.get_age();

    println!("Hello, world!: {name}, {age}");
}

Setter

Setter宏为结构中的每个字段生成一个 set_{fieldname} 方法。

use rombok::Setter;

#[Setter]
struct Person {
    name: String,
    age: u8,
}

fn main() {
    let mut person = Person {
        name: "John".to_string(),
        age: 30,
    };

    person.set_name("Jane".to_string());
    person.set_age(31);

    println!("Hello, world!: {}, {}", person.name, person.age);
}

With

With宏为结构中的每个字段生成一个 with_{fieldname} 方法。与Setter不同,它通过移动操作修改值,并将修改后的对象作为返回值。

use rombok::With;

#[With]
struct Person {
    name: String,
    age: u8,
}

fn main() {
    let person = Person {
        name: "".to_string(),
        age: 0,
    }.with_name("Jane".to_string()).with_age(31);

    let person = person.with_name("tom".to_string()).with_age(44);

    println!("Hello, world!: {}, {}", person.name, person.age);
}

Builder

Builder宏为结构生成Builder模式对象,并为结构添加一个静态builder方法。Builder中的每个方法都是通过With模式实现的。

use rombok::Builder;

#[Builder]
struct Person {
    name: String,
    age: u8,
}

fn main() {
    let person = Person::builder()
        .name("Jane".to_string())
        .age(31)
        .build();

    println!("Hello, world!: {}, {}", person.name, person.age);
}

AllArgsConstructor

这是一个属性宏,它创建一个初始化结构体所有字段的构造函数。

use rombok::AllArgsConstructor;

#[AllArgsConstructor]
struct Person {
    name: String,
    age: u8,
    money: Option<f64>,
    point: (u8, u8),
}

fn main() {
    let person = Person::with_all_args(
        "John".to_string(),
        30,
        Some(100.0),
        (10, 20),
    );

    let name = person.name;

    println!("Hello, world!: {name}");
}

NoArgsConstructor

这是一个属性宏,它创建一个不接受参数且初始化所有字段为默认值的构造方法。每个字段的类型必须实现Default特质。

use rombok::NoArgsConstructor;

#[NoArgsConstructor]
struct Person {
    name: String,
    age: u8,
    money: Option<f64>,
}

fn main() {
    let person = Person::with_no_args();

    let money = person.money;

    println!("Hello, world!: {money:?}");
}

EqualsAndHashcode

这是一个属性宏,它为结构生成 equalshashcode 方法。(Eq、Hash特质)

use rombok::EqualsAndHashcode;

use std::hash::{DefaultHasher, Hash, Hasher};

#[derive(Debug)]
#[EqualsAndHashcode]
struct Person {
    name: String,
    age: u8,
}

fn main() {
    let person = Person {
        name: "John".to_string(),
        age: 30,
    };

    let person2 = Person {
        name: "Jane".to_string(),
        age: 30,
    };

    let mut hasher = DefaultHasher::new();
    person.hash(&mut hasher);
    let hashcode = hasher.finish();
    println!("hashcode: {:?}", hashcode);

    assert_ne!(person, person2);
}

ToString

这是一个属性宏,它为结构生成 to_string 方法。(Display、ToString、Debug特质)

use rombok::ToString;

#[ToString]
struct Person {
    name: String,
    age: u8,
}

fn main() {
    let person = Person {
        name: "John".to_string(),
        age: 30,
    };

    println!("to_string: {}", person.to_string());
}

Value

此宏是以下宏的组合样板:ToString + EqualsAndHashcode + Getter + AllArgsConstructor

use rombok::Value;

#[Value]
struct Person {
    name: String,
    age: u8,
}

fn main() {
    let person = Person::with_all_args("John".to_string(), 30);

    println!("age: {}", person.get_age());

    let person2 = Person::with_all_args("Jane".to_string(), 30);
    assert_ne!(person, person2);

    println!("person: {}", person.to_string());
}

无运行时依赖