7个版本
0.2.1 | 2023年11月12日 |
---|---|
0.2.0 | 2023年11月12日 |
0.1.4 | 2023年11月12日 |
在 过程宏 中排名 314
每月下载量 39
22KB
80 行
此过程宏创建一个接受与您的 struct
中声明的相同字段作为参数的 const
fn new 关联函数。
所以这个
#[derive(New)]
struct Cube {
r: i32,
c: i32,
z: i32,
w: i32,
}
... 将创建这个
impl Cube {
const fn new(r: i32, c: i32, z: i32, w: i32) -> Self {
Self { r, c, z, w }
}
}
备注:Rust Analyzer 已经为您生成了 new
函数!
https://rust-analyzer.github.io/manual.html#assists-code-actions
备注2:我发现(2023-11-12)另一个已经做这件事的crate!=) 很有趣的是,它有相同的名字,但是顺序颠倒了:derive-new
它比这个更强大,因为它处理默认值、枚举和 PhantomData
。
尽管 此crate创建一个 const
fn,而 derive-new
则没有。
使用方法
https://crates.io/crates/new-derive
cargo add new-derive
`use new_derive::New;
#[derive(New)]
struct Cube {
r: i32,
c: i32,
z: i32,
w: i32,
}
#[derive(Debug, New)]
struct V {
b: Vec<String>,
}
#[derive(Debug, New)]
struct B {
b: Box<String>,
}
#[derive(Debug, New)]
struct S1 {
array1: [i32; 3],
name: String,
}
#[derive(Debug, New)]
struct S2 {
opt1: Option<String>,
idx: usize,
map1: std::collections::HashMap<i32, i32>,
}
#[derive(Debug, New)]
struct Life1<'a> {
name: &'a str,
}
fn main() {
let cube = Cube::new(1, 2, 3, 4);
println!("{}", cube.r * cube.c * cube.z * cube.w);
let s1 = S1::new([1, 2, 3], "Leandro".into());
dbg!(s1);
let map1 = std::collections::HashMap::from([(10, 20)]);
let s2 = S2::new(Some("ola".into()), 30, map1);
dbg!(s2);
let country = "Brazil";
let lifetime_test = Life1::new(country);
println!("Country is: {}", lifetime_test.name);
}
输出
24
[src/main.rs:44] s1 = S1 {
array1: [
1,
2,
3,
],
name: "Leandro",
}
[src/main.rs:48] s2 = S2 {
opt1: Some(
"ola",
),
idx: 30,
map1: {
10: 20,
},
}
Country is: Brazil
依赖
~85KB