#macro-derive #proc-macro #getter-setter #struct-fields #utility #auto-methods

macro basicmethod

使用 derive 宏添加构造函数、获取和设置方法

3 个版本

0.1.2 2023年12月26日
0.1.1 2023年12月9日
0.1.0 2023年12月5日

#392过程宏

每月下载量 21 次

MIT/Apache

26KB
478

basicmethod

**使用 derive 宏添加构造函数、获取和设置方法

  • 版本 0.1.2 的新功能:现在有 inc 和 dec 方法可用(参见 quick_start 示例代码)

  • 版本 0.1.1 的新功能:现在有 get_mut 方法可用

  • 此 Crates 包含 derive 宏,可添加以下功能:* 构造函数 - 新方法 * 获取器 - 为每个结构体字段提供获取方法 * 设置器 - 为每个结构体字段提供设置方法 * 信息 - 打印结构体文档的信息方法 * 字段 - 返回字段 Vec<(&str, &str)> 的字段方法 **支持结构体、单元结构和元组结构体

示例 - 快速入门

// src/main.rs
use basicmethod::BasicMethod;

pub enum Division {
    Marketing, IT, Finance, Other
}

#[derive(BasicMethod)]
/// Sample documentation
struct Sample {
    #[allow(dead_code)]id: i32,
    name: String,
    age: u8,
    #[allow(dead_code)]division: Division
}

fn demo1() {
    let mut s = Sample::new(23, "Natalia".to_string(), 35, Division::IT);
    println!("{}", s.get_name());
    s.set_name("Mundo".to_string());
    println!("{}", s.get_name());
    let i = Sample::info();
    assert_eq!("Sample documentation", i.as_str());

    for (field, ftype) in Sample::fields() {
        println!("{}-> {}", field, ftype);
    }

    // new method - v.0.1.2
    let x = s.inc_age(4);
    assert_eq!(39, x);
}

#[derive(BasicMethod)]
/// A tuple struct
struct Player(String, i16);

fn demo2() {
    let mut kowi = Player("Joko".to_string(), 55);
    for field in Player::fields() {
        println!("{}", field)
    }
    kowi.set_String_0("Jokowido".to_string());
    kowi.set_i16_1(64);
    println!("{} {}", kowi.get_String_0(), kowi.get_i16_1());

    // new method - v.0.1.2
    let x = kowi.inc_i16_1(-4);
    assert_eq!(60, x);
}

#[derive(BasicMethod)]
struct Demo {
    val: u8
}

fn demo3() {
    let mut v = Demo::new(10);
    let mutv = v.get_val_mut();
    *mutv += 5;
    assert_eq!(15, *v.get_val());

    // new method - v.0.1.2
    v.inc_val(20);
    assert_eq!(35, *v.get_val());

    v.dec_val(2);
    assert_eq!(33, *v.get_val());

    // v.dec_val(34);  // will panic, because val is u8;
    // assert_eq!(-1, *v.get_val());

    v.dec_tozero_val(3);
    assert_eq!(30, *v.get_val());

    v.dec_tozero_val(31);
    assert_eq!(0, *v.get_val());
}

fn main() {
    demo1();
    demo2();
    demo3();
}

依赖关系

~255–700KB
~17K SLoC