gpt4 book ai didi

rust - 如何在 Rust 过程宏中获取 impl block 的类型?

转载 作者:行者123 更新时间:2023-11-29 08:29:18 29 4
gpt4 key购买 nike

我正在尝试编写一个可以应用于这样的 impl block 的 Rust 过程宏;

struct SomeStruct { }

#[my_macro]
impl SomeStruct { }

我正在使用 syn 和 quote 来解析和格式化宏中的 TokenStream。它看起来像这样:

#[proc_macro_attribute]
pub fn my_macro(meta: TokenStream, code: TokenStream) -> TokenStream {
let input = parse_macro_input!(code as ItemImpl);

// ...

TokenStream::from(quote!(#input))
}

有没有办法使用 syn 访问 impl block 的类型名称?我在 ItemImpl 中没有看到任何字段给我该信息。

最佳答案

documentationItemImpl 上列出 9 个字段:

  1. attrs: Vec<Attribute>
  2. defaultness: Option<Default>
  3. unsafety: Option<Unsafe>
  4. impl_token: Impl
  5. generics: Generics
  6. trait_: Option<(Option<Bang>, Path, For)>
  7. self_ty: Box<Type>
  8. brace_token: Brace
  9. items: Vec<ImplItem>

其中只有一个有“type”这个词:self_ty .

use syn; // 0.15.23

fn example(input: syn::ItemImpl) {
println!("{:#?}", input.self_ty);
}

fn main() {
let code = syn::parse_str(
r###"
impl Foo {}
"###,
)
.unwrap();

example(code);
}
Path(
TypePath {
qself: None,
path: Path {
leading_colon: None,
segments: [
PathSegment {
ident: Ident(
Foo
),
arguments: None
}
]
}
}
)

关于rust - 如何在 Rust 过程宏中获取 impl block 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53925873/

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