91得票4回答
我该如何查看导致编译错误的宏展开代码?

我遇到了一个涉及宏的编译错误: <mdo macros>:6:19: 6:50 error: cannot move out of captured outer variable in an `FnMut` closure <mdo macros>:6 bind ( ...

34得票3回答
如何使用quote宏在过程宏中报告错误?

我正在编写一个过程宏,它运行良好,但我在以符合人体工程学方式报告错误方面遇到了麻烦。使用 panic!“可以”,但不够优雅,也无法将错误消息漂亮地呈现给用户。我知道在解析TokenStream时可以报告好的错误,但我需要在解析后遍历AST时产生错误。宏调用看起来像这样: attr_test!...

31得票2回答
如何以编程方式获取结构体字段的数量?

我有一个自定义结构体,其如下所示:struct MyStruct { first_field: i32, second_field: String, third_field: u16, } 是否有可能通过编程方式获取结构体字段的数量(例如,通过调用 field_coun...

20得票1回答
在 Rust 的过程宏中存储状态是否可行?

是否可以构建一个宏,不输出任何东西,而是将状态存储起来以构建列表,然后第二个宏将使用该数据并输出某些结果? 例如: trait SomeTrait {} #[derive(mark)] struct Person {} impl SomeTrait for Person {} #[d...

17得票4回答
如何在过程宏中获取字面量的值和类型?

我正在实现一个类似函数的过程宏,它需要以单个字符串字面量作为参数,但我不知道如何获取字符串字面量的值。 如果我打印变量,它会显示一堆字段,其中包括类型和值。它们显然存在于某个地方。我该如何获取它们? extern crate proc_macro; use proc_macro::{Tok...

15得票2回答
有没有一种方法可以在编译时获取过程宏所附加的文件和模块路径?

我在寻找在过程宏上下文中等效于file!()和module_path!()的功能。 例如,以下内容无法正常工作: file.rs:#[some_attribute] const A: bool = true; macro.rs:#[proc_macro_attribute] pub fn ...

14得票2回答
我该如何创建一个proc_macro_attribute?

现在proc_macros已经稳定,那么如何创建这样一个东西呢? 从我所见,有一种选项是在fn whatsitsname(attrs: TokenStream, code: TokenStream) -> TokenStream上放置#[proc_macro_attribute]注释,...

13得票2回答
当使用syn时,我如何从Option<T>中获取T?

我正在使用 syn 解析 Rust 代码。当我使用 field.ty 读取命名字段的类型时,我得到了一个 syn::Type。当我使用 quote!{#ty}.to_string() 进行打印时,我得到了 "Option&lt;String&gt;"。我该如何才能得到仅为 "String"? ...

13得票1回答
如何使我的自定义派生宏接受特质泛型参数?

我正在尝试为我的特质实现自定义派生宏,它们实际上起作用了! 但是我有一个小问题。我似乎找不到一种将通用参数包含到特质中的方法。 具体来说,我想做这样的事情:#[derive(MyCustomDerive&lt;'a, B, C&gt;)] 而现在,我正在硬编码泛型参数,像这样:let g...

11得票2回答
如何创建类似函数的过程宏?

如何定义a_proc_macro以便它“返回”值为5? fn main() { let a = a_proc_macro!(); assert!(a == 5); }