gpt4 book ai didi

rust - 在procmacro中的所有字段和子字段上递归调用函数

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

我有一个派生样式过程宏,在这里我想计算结构的序列化版本的最大潜在长度。例如,给定下面的TestStruct结构,我想在所有字段中调用某个函数来计算最坏情况的长度。

#[derive(MyLengthProcMacro)]
struct TestStruct {
f1: u32,
f2: i64,
f3: SomeOtherStruct
}

对于基元,它可能类似于:

fn get_string_length(ty: &Type) -> usize {
let type_string = quote! { #ty }.to_string();
match type_string.replace(" ", "").as_str() {
"str" => panic!("String slices must be annotated with a length using #[at_arg()]"),
"tuple" => panic!("Tuples are not supported!"),
"char" => "a".len(),
"bool" => "false".len(),
"isize" => format!("{:?}", std::isize::MAX).len(),
"usize" => format!("{:?}", std::usize::MAX).len(),
"u8" => format!("{:?}", std::u8::MAX).len(),
"u16" => format!("{:?}", std::u16::MAX).len(),
"u32" => format!("{:?}", std::u32::MAX).len(),
"u64" => format!("{:?}", std::u64::MAX).len(),
"u128" => format!("{:?}", std::u128::MAX).len(),
"i8" => format!("{:?}", std::i8::MIN).len(),
"i16" => format!("{:?}", std::i16::MIN).len(),
"i32" => format!("{:?}", std::i32::MIN).len(),
"i64" => format!("{:?}", std::i64::MIN).len(),
"i128" => format!("{:?}", std::i128::MIN).len(),
"f32" => format!("{:?}", std::f32::MIN).len(),
"f64" => format!("{:?}", std::f64::MIN).len(),
_ => {
// println!("Unexpected type: {:?}", type_string);
0
}
}
}

我在这里要问的问题是关于任何非原始字段,例如。 f3: SomeOtherStruct。有没有办法在proc宏中访问字段的字段?

最佳答案

不。

宏在进行此类分析之前就已扩展,因此编译器不知道此时的SomeOtherStruct是什么。

但是,这不是应该实现该宏的方式!您的方式不允许用户使用类型别名。

您应该做的就是简单地递归使用特征并使用<T as MyLength>::my_length()求和,其中T是每个字段的字段类型。

他们为原始类型手动实现您的特征。

关于rust - 在procmacro中的所有字段和子字段上递归调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61337244/

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