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