7 个不稳定版本 (3 个破坏性更新)
| 0.4.2 | 2021 年 9 月 29 日 |
|---|---|
| 0.4.1 | 2021 年 9 月 29 日 |
| 0.3.1 | 2021 年 9 月 27 日 |
| 0.2.0 | 2021 年 9 月 25 日 |
| 0.0.1 |
|
#332 在 解析工具
每月下载量 23 次
34KB
644 代码行
derived:自动化乏味操作的宏
derived crate 提供宏,可以简化所有乏味的操作,例如编写构造函数。使用此 crate,您可以为 编译时,常量默认实现、构造函数、获取器 和 设置器 创建具有完整泛型和生命周期支持的实现。
特性
- ☑️
Ctor:生成 构造函数 - 🤌
Gtor:生成 获取器 - ⚙️
Stor:生成 设置器 - 🎉 常量,编译时默认实现
包括 数组、元组、数组中的嵌套元组 和 元组中的嵌套数组!
- 💯 完整生命周期,泛型 和
where子句支持 - 🤓 高级特性
- 使用
gtor属性来获取不可变、可变或两者的引用(请参阅以下示例) - 使用
#[stor_skip]或#[gtor_skip]属性跳过特定字段的设置器或获取器的生成 - 使用
#[ctor_const]和#[gtor_const]属性将构造函数和获取器设为const - 跳过带有
PhantomData字段和#[phantom]属性的构造函数、析构函数和存储函数
- 使用
示例:常量 default 实现方法
use derived::Constdef;
#[derive(Constdef)]
struct MyConst {
a: u8,
b: bool,
c: char,
}
const MYCONST: MyConst = MyConst::default();
// use it with other consts
const ZERO_U8: u8 = MYCONST.a;
assert_eq!(MYCONST.a, 0);
assert_eq!(MYCONST.b, false);
assert_eq!(MYCONST.c, '\0');
示例:生成构造函数
use derived::Ctor;
#[derive(Ctor)]
pub struct MyStruct {
a: u8,
b: i8,
}
let mystruct = MyStruct::new(1, -1);
assert_eq!(mystruct.a, 1);
assert_eq!(mystruct,b, -1);
示例:生成获取器
use derived::{Ctor, Gtor};
// we'll derive `Ctor` to avoid having to write ctors
#[derive(Ctor, Gtor)]
pub struct MyStruct {
name: String,
userid: u64,
}
let ms = MyStruct::new("Sayan".to_owned(), 1);
assert_eq!(ms.get_name(), "sayan");
// we don't need to deref because u64 is a copy type
assert_eq!(ms.get_userid(), 1);
示例:生成设置器
use derived::{Ctor, Stor};
// we'll derive `Ctor` to avoid having to write ctors
#[derive(Ctor, Stor)]
pub struct MyStruct {
name: String,
userid: u64,
}
let mut ms = MyStruct::new("Sayan".to_owned(), 1);
assert_eq!(ms.get_name(), "sayan");
// we don't need to deref because u64 is a copy type
assert_eq!(ms.get_userid(), 1);
ms.set_userid(0);
assert_eq!(ms.get_userid(), 0);
示例:结构体中的高级泛型和生命周期
use derived::{Ctor, Gtor};
#[derive(Ctor, Gtor)]
struct MyTag<'a, T: ToString> {
val: &'a T,
tag: u8,
}
let mut x = MyTag::new(&10i32, 20); // this will have type MyTag<i32>
// you can now use getters and setters as you please!
assert_eq!(x.get_val().to_string(), "10");
x.set_val(11);
assert_eq!(x.get_val().to_string(), "11");
示例:生成 get_mut 和 get
use derived::{Ctor, Gtor};
#[derive(Ctor, Gtor)]
#[gtor(get, get_mut)]
pub struct Mutable {
x_axis: u8,
y_axis: u8,
}
#[test]
fn test_get_and_get_mut() {
let mut m = Mutable::new(0, 0);
// move x by 1 unit
*m.get_x_axis_mut() = 1;
// move y by 2 units
*m.get_y_axis_mut() = 2;
assert_eq!(m.get_x_axis(), 1);
assert_eq!(m.get_y_axis(), 2);
}
许可证
本软件包遵循 Apache-2.0 许可证 进行分发。
依赖关系
约 1.5MB
约 35K SLoC