rust - 如何过滤掉 proc_macro_derive 中所有 Option 类型的字段
问题描述
我正在创建我的第一个派生宏。我正在尝试从结构中过滤所有非可选字段。我想将它们用于构造函数。我不确定如何提取它们。我正在考虑获取类型的路径,并检查该路径是否等于std::option::Option
. 这并没有真正奏效。谁能告诉我我做错了什么,或者我应该如何继续?
这一切都符合let non_optional_field_arguments = ...
// This function is not really interesting for this question
fn to_argument(field: &syn::Field) -> proc_macro2::TokenStream{
let field_name = &field.ident;
let field_type = &field.ty;
quote! {
#field_name : #field_type
}
}
#[proc_macro_derive(Creator)]
pub fn derive_creator(_item: TokenStream) -> TokenStream {
let item = parse_macro_input!(_item as DeriveInput);
let item_ident = item.ident;
let fields = if let syn::Data::Struct(syn::DataStruct {
fields: syn::Fields::Named(syn::FieldsNamed {ref named, ..}),
..
}) = item.data {
named
} else {
panic!("You can derive only on struct!")
};
let field_arguments = fields.iter().map(to_argument);
let non_optional_field_arguments = fields.iter().filter(|field| {
return if let syn::Field{ty: syn::Type::Path(ref path), ..}= field{
// I want to work with this, but the debug trait is not implemented
let segments = &path.path.segments;
true
} else {
false
}
}).map(to_argument);
unimplemented!()
}
解决方案
推荐阅读
- r - R:正则表达式匹配方括号中的模式,但有异常
- cygwin - 为什么 rm 在我的 Makefile 中不起作用?使用 cygwin 和 git
- android - 如何为 Android 的内置文件选择器提供路径?
- c++ - C++ 编译器通常会“优化”malloc 并且可以自由地新建和删除吗?
- php - Laravel - 无法在 foreach 循环中保存 morphToMany 关系
- javascript - 在 Leaflet 图层上添加自定义按钮
- android - Android MediaPlayer: MediaPlayerNative: 信息/警告 (10973, 0)
- performance - Google PageSpeed:桌面和移动之间的巨大差距
- android - 后台服务是否计入 Firebase 当前的活跃用户?
- angular - Angular:无法从另一个 Angular 库中检测到打字稿工件