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

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

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

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

9得票1回答
将字符串转换为TokenStream

如何将一个字符串(str)转换为 Rust 中的 TokenStream? 我尝试使用 quote! 宏。 let str = "4"; let tokens = quote! { let num = #str; }; // #str is a str not i32 这里的目标是为一...

8得票1回答
实现过程宏时,如何检查类型是否实现了一个特质?

我正在尝试创建一个proc-macro,以推导并为结构体实现特质,并且我需要确保结构体内的所有字段都实现了Display。 我该如何检查呢? 此外,我该如何检查属性是否也实现了Iterator? (我希望能处理迭代器项是否也实现了display)。 我使用了syn和quote库。我已经成...

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

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

7得票1回答
什么地方适合将过程宏工件存储在磁盘上,以便由Cargo清理?

我有一个过程宏需要存储半持久化状态。该状态需要在编译运行中存活,并且应该在运行 cargo clean 命令时被清理。 过去,我使用了 ./target 目录来实现这个目的。然而,这是一个错误的做法,因为我的一些过程宏生成的文件可能会与 rustc 和 cargo 生成的文件发生冲突。同时,...

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

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

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

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

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

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

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

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