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 2021 年 9 月 25 日

#332解析工具

每月下载量 23 次

Apache-2.0

34KB
644 代码行

derived:自动化乏味操作的宏

GitHub Workflow Status Crates.io docs.rs GitHub

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_mutget

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