gpt4 book ai didi

enums - Rust proc_macro_derive(带有syn crate)生成用于匹配的枚举变量

转载 作者:行者123 更新时间:2023-12-03 11:49:03 24 4
gpt4 key购买 nike

我是一个使用rust 的新手,我是一周前开始的,但是这种语言已经非常令人兴奋。我在rust中重新编写了一个nodejs项目,以获得更好的性能,而现在它的速度如此之快,真是太疯狂了。

我实际上是在写proc_derive_macro(使用“syn” crate )以在某些特定结构上生成方法。我快完成了,但是我找不到如何生成枚举变量。我会尽力解释自己。

那就是我的代码生成(使用引号!)

quote! {
// The generated impl.
impl #name /*#ty_generics #where_clause*/ {
pub fn from_config(config: &IndicatorConfig) -> Result<Self, Error> {
let mut #name_lower = #name::default()?;
for (k, v) in config.opts.iter() {
println!("{:?} {:?}", k, v);
match (k.as_str(), v) {
("label", Values::String(val)) => {
#name_lower.label = val.clone();
}
("agg_time", Values::String(val)) => {
#name_lower.agg_time = Some(val.clone());
}
#(
(#fields_name_str, Values::Unteger(val)) => {
#name_lower.#fields_name = val.clone();
}
)*
(&_, _) => {}
}
}
#name_lower.init()?;
Ok(#name_lower)
}
}
};

如我们所见,我在这里生成了很多代码
(#fields_name_str, Values::Unteger(val)) => {
#name_lower.#fields_name = val.clone();
}

但是我没有找到一种方法来生成“匹配的枚举变量”(我不知道我们怎么称呼它,希望您能理解):
Values::String(val)
OR
Values::Unteger(val)
...

我正在编写一个函数,它将根据在struct中找到的参数类型创建变量匹配:
fn create_variant_match(ty: &str) -> PatTupleStruct {
let variant = match ty {
"u32" => Ident::new("Unteger", Span::call_site()),
...
_ => unimplemented!(),
};
}

实际上,我正在创建一个Ident,但我想创建“枚举变量匹配”-> Values::Unteger(val)。

我看了合成器的文档,花了数小时试图找到一种方法,但这对于我的实际水平来说有点复杂,所以我希望有人能解释一下如何做到这一点。

最佳答案

我找到了一种简单的方法。只需使用syn解析器解析一个字符串(我可以在此之前格式化)即可。
以前没有想过要手动构建Expr(有点愚蠢的^^)

syn::parse_str::<Expr>("Values::Unteger(val)")

这将生成所需的Expr

关于enums - Rust proc_macro_derive(带有syn crate)生成用于匹配的枚举变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61311130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com