问题标签 [rust-macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4059 浏览

struct - 如何以编程方式获取结构的字段数?

我有一个自定义结构,如下所示:

是否可以通过编程方式获取结构字段的数量(例如,通过方法调用field_count()):

对于这个结构:

...以下调用应返回1

是否有类似的 APIfield_count()或者只能通过宏获得?

如果这可以通过宏实现,应该如何实现?

0 投票
1 回答
575 浏览

macros - 匹配封闭函数的返回类型

Rust 宏是否可以匹配封闭函数的返回类型?

一个示例类似于日志记录和断言宏,它也会在返回Err的函数中返回Result,而在未返回的函数中出现恐慌Result。为了实现这一点,宏应该以某种方式知道封闭函数的返回类型。

我想这对于声明性宏 ( ) 是不可能的,macro_rules!因为它们有一组有限的匹配类型(如Rust 参考,示例宏一章中所述):项目、块、语句、模式、表达式、类型、标识符等on,但不是封闭函数的返回类型。

但也许使用过程宏?

0 投票
2 回答
4910 浏览

error-handling - 如何使用引用宏报告程序宏中的错误?

我正在编写一个运行良好的程序宏,但我无法以符合人体工程学的方式报告错误。使用panic!“有效”但并不优雅,也不能很好地向用户显示错误消息。

我知道我可以在解析 a 时报告好的错误TokenStream,但是在解析 AST 后我需要在遍历 AST 时产生错误。

宏调用如下所示:

并且应该输出:

这是宏代码:

bool如果属性中没有指定任何内容,我想产生一个错误。例如,像这样输入:

应该导致类似:

在解析过程中,有 a Result,其中包含很多有用的信息,包括 a span,因此产生的错误可以突出显示有问题的宏调用的确切部分。但是一旦我遍历 AST,我就看不到报告错误的好方法。

这应该怎么做?

0 投票
1 回答
1458 浏览

syntax - Rust 声明性宏中的 @ 符号是什么意思?

我见过@宏中使用的符号,但我在 Rust Book 或任何官方文档或博客文章中都找不到它的提及。例如,在这个 Stack Overflow 答案中,它是这样使用的:

从用法来看,它似乎用于声明另一个宏是主宏的本地宏。

这个符号是什么意思,为什么要使用它而不是创建另一个顶级宏?

0 投票
1 回答
321 浏览

rust - 有没有办法在非夜间 Rust 上查看扩展宏?

我意识到之前有人问过这个问题,答案是使用-Zwith 选项rustc,但这仅适用于 Rust 1.31 的夜间构建。

使用稳定版本时有其他选择吗?

0 投票
1 回答
313 浏览

rust - 在声明性宏中构建所有元素对(二次集)

我有一个标识符列表,我想为该列表中的每对标识符调用一个宏。例如,如果我有a,bc,我想生成这个:

当然,这是一个虚拟的例子。在我的真实代码中,标识符是类型,我想生成impl块或类似的东西。

我的目标是只列出每个标识符一次。在我的真实代码中,我有大约 12 个标识符并且不想手动写下所有 12² = 144 对。所以我认为宏可能会帮助我。我知道它可以用所有强大的过程宏来解决,但我希望它也可以用声明性宏(macro_rules!)来解决。


我尝试了我认为是处理这个问题的直观方法(两个嵌套的“循环”)(Playground):

但是,这会导致此错误:

我想这是有道理的,所以我尝试了其他东西(Playground):

但这会导致与上述相同的错误!

这完全可以使用声明性宏吗?

0 投票
0 回答
31 浏览

rust - 使用包含的文本作为宏参数

我正在尝试创建在编译时解析 C 头文件的可能性(并生成一堆要在其他代码中使用的数字常量)。我不需要解析所有的头文件结构,因为我控制了它的内容并且知道这个文件#define里面只有 s。所以我尝试了以下方法:

它在我在代码本身中编写#defines 时起作用,但在我使用时不起作用include!,因为include!宏在我的宏之前没有展开,并且它失败并出现“没有规则预期令牌”错误。有什么解决方法吗,还是我必须使用 proc 宏?

0 投票
1 回答
1064 浏览

rust - 宏中的元组索引

我正在尝试在为特征实现生成签名的宏中索引数据元组,但有一些错误。我可以索引元组还是需要其他解决方案?破解tuple_index我在谷歌找到的,但它对我不起作用。

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=7d4bc0f56c643cf4693279a9bd9db973

编译错误:

0 投票
1 回答
135 浏览

rust - 如何禁用“不必要的路径消歧器”警告?

我正在使用宏生成代码,其中包含完全限定的类型路径,如下所示:

::注意前面的多余<String>。这是必要的,因此相同的输入标记也可以用于构造函数,方法是附加::new()

但是,这会产生警告:

我无法删除,::因为我收到一个错误:

如何仅针对这一行禁用警告?

0 投票
1 回答
769 浏览

rust - 如何在类型上而不是在类型内部使用自定义命名空间派生宏属性?

我想创建一个使用新命名空间属性语法的自定义派生宏:example::attr. 我已经能够让它与类型内的属性一起工作(例如,在结构字段或枚举变体上),但不适用于类型本身。

src/main.rs

过程宏本身什么也不做,除了声明它example::attr是一个有效的属性。

复制衍生/src/lib.rs

编译产量:

切换到属性 ( ) 的非命名空间形式example_attr可以正常工作。


我正在使用 Rust 1.32.0。项目布局为

货运.toml

repro-derive/Cargo.toml