#getter-setter #accessor #macro-derive #getter #setter #derive #macro

getters2

为结构体和枚举生成获取器、可变获取器、设置器和复制访问器

4 个版本

0.1.4 2024年2月1日
0.1.3 2024年1月5日
0.1.2 2023年12月6日
0.1.0 2023年12月6日

#1421 in 过程宏

Download history 22/week @ 2024-03-13 8/week @ 2024-03-20 1/week @ 2024-03-27 15/week @ 2024-04-03 30/week @ 2024-04-10 9/week @ 2024-04-17 8/week @ 2024-04-24 8/week @ 2024-05-08 17/week @ 2024-05-15 6/week @ 2024-05-22 137/week @ 2024-05-29 195/week @ 2024-06-05 212/week @ 2024-06-12 171/week @ 2024-06-19 173/week @ 2024-06-26

每月 789 次下载
用于 simics-test

Apache-2.0

35KB
484

Getters2

Getters2 是 Rust 中最好的“自动获取器”/“自动设置器”crate。

  • 可选择的不可变/可变/克隆/解引用获取器
  • 支持命名、元组和 newtype 结构体
  • 支持命名、元组和 newtype 枚举

安装

cargo add getters2

或者,将其添加到 Cargo.toml

[dependencies]
getters2 = "0.1.0"

示例

Getters2 的 API 非常简单。

结构体

use getters2::Getters;
#[derive(Getters)]
#[getters(mutable, clone, deref)]
struct Vector3 {
   x: f32,
   y: f32,
   z: f32,
   #[getters(skip, skip_mutable, skip_clone, skip_deref)]
   name: String,
}

let mut v = Vector3 { x: 1.0, y: 2.0, z: 3.0, name: "MyVec".to_string() };
assert_eq!(v.x_ref(), &1.0);
assert_eq!(v.y_ref(), &2.0);
assert_eq!(v.z_ref(), &3.0);
assert_eq!(v.x_deref(), 1.0);
assert_eq!(v.y_deref(), 2.0);
assert_eq!(v.z_deref(), 3.0);
assert_eq!(v.x_clone(), 1.0);
assert_eq!(v.y_clone(), 2.0);
assert_eq!(v.z_clone(), 3.0);
*v.x_mut() = 4.0;
*v.y_mut() = 5.0;
*v.z_mut() = 6.0;
assert_eq!(v.x_ref(), &4.0);
assert_eq!(v.y_ref(), &5.0);
assert_eq!(v.z_ref(), &6.0);

枚举

use getters2::Getters;
#[derive(Getters)]
#[getters(deref, clone, mutable)]
enum Animal {
   Dog { name: String, age: u8 },
   Cat { name: String, age: u8 },
}
let mut dog = Animal::Dog { name: "Rover".to_string(), age: 5 };
let mut cat = Animal::Cat { name: "Mittens".to_string(), age: 3 };
assert_eq!(dog.dog_name_ref(), Some(&"Rover".to_string()));
assert_eq!(dog.dog_name_deref(), Some("Rover".to_string()));
assert_eq!(dog.dog_name_clone(), Some("Rover".to_string()));
assert_eq!(dog.dog_age_ref(), Some(&5));
assert_eq!(dog.dog_age_deref(), Some(5));
assert_eq!(dog.dog_age_clone(), Some(5));

let Some(dog_name) = dog.dog_name_mut() else {
   panic!("Expected Some");
};
*dog_name = "Spot".to_string();

assert_eq!(dog.dog_name_ref(), Some(&"Spot".to_string()));

assert_eq!(cat.cat_name_ref(), Some(&"Mittens".to_string()));
assert_eq!(cat.cat_name_deref(), Some("Mittens".to_string()));
assert_eq!(cat.cat_name_clone(), Some("Mittens".to_string()));
assert_eq!(cat.cat_age_ref(), Some(&3));
assert_eq!(cat.cat_age_deref(), Some(3));
assert_eq!(cat.cat_age_clone(), Some(3));

let Some(cat_name) = cat.cat_name_mut() else {
  panic!("Expected Some");
};
*cat_name = "Whiskers".to_string();

assert_eq!(cat.cat_name_ref(), Some(&"Whiskers".to_string()));

现有技术

有很多 crate 声称可以做到这一点。Getters2 有它们都没有的东西。

依赖关系

~0.7–1.1MB
~25K SLoC