5 个不稳定版本
0.3.0 | 2024 年 5 月 29 日 |
---|---|
0.2.0 | 2024 年 5 月 26 日 |
0.1.2 | 2024 年 5 月 25 日 |
0.1.1 | 2024 年 5 月 25 日 |
0.1.0 | 2024 年 5 月 25 日 |
#3 in #getter
每月 203 次下载
14KB
56 行
rombok
类似于 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 中的每个方法都是通过 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
这是一个属性宏,用于为结构生成 equals
和 hashcode
方法。(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());
}