问题标签 [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 投票
0 回答
44 浏览

rust - 为什么要格式化!不能在return语句中使用?

编译

对于非工作示例,我收到以下错误:

当宏在 return 语句中时,是否会发生一些隐含的事情?

0 投票
1 回答
802 浏览

compiler-errors - 在编译时发出警告?

我想在编译时发出警告,可能来自宏。它不应该被 静音cap_lints。我当前的用例是功能弃用,但还有其他可能的用途。

0 投票
1 回答
163 浏览

rust - 在 macro_rules 中存储状态

我想创建一个对给定类型列表进行操作的宏,但我需要能够存储正在处理的其他类型。

我想做的一个简单的例子:

问题是它似乎macro_rules不允许我存储临时状态(即HashSet,我将标记哪些类型是宏调用的一部分)。我想到的唯一解决方法是编写我想要的内容proc_macro_derive并为我需要的每种类型手动添加自定义属性,但这显然远非完美......

编辑:

这个问题类似于这个问题,但在这里我试图在一个宏调用中本地和临时保存一个状态(基本上在存储有关这些参数的数据时对参数进行两次传递)。然而,这似乎也是不可能的。

0 投票
1 回答
359 浏览

rust - 锈打印!问题 - println 宏内部的奇怪行为

我目前正在开发一个简单的“用户输入”程序。用户可以输入一个数字,我用 std::io::stdin().read_line(&mut let_name_here).ok().expect("Error");. 获得用户输入后,我想将其打印到控制台以供查看。

我注意到 println! 中的奇怪行为!宏。以下代码

输出这个:

为什么marco中有多余\n的东西。println!根据我的编码经验,我会假设以下内容:

但要实现此输出,我必须使用以下代码:

我不明白为什么println!marco 输出\n两次。我会怎么做,如果我想\n在第一行的末尾,用这两个马科斯是不可能的。我错过了什么重要的东西吗?

0 投票
2 回答
378 浏览

rust - 使用不同“种类”元素构建枚举的宏

我正在尝试提出一个我称之为宏的宏

它将创建一个枚举来表示状态机状态,其中一些将是最终(接受)状态 - S2, S3. 生成的枚举及其impl应如下所示:

我天真的尝试:

最终出现以下错误:

尝试删除第二行中模式之间的逗号:

正在生产另一个:

我了解导致这些错误的原因 - 它认为这final是另一个标识符匹配r。但是编写这样一个宏的正确方法是什么(如果可能的话,不会过于复杂)?

我对宏调用有充分的灵活性,因为这是我个人的学习练习。主要目标是学习正确的做事方式。如果可能的话,最好让这个宏final在任何位置接受。

0 投票
1 回答
1347 浏览

rust - 计算并生成重复结构字段的 Rust 宏

我想编写一个从整数参数生成不同结构的宏。例如,make_struct!(3)可能会生成如下内容:

将“3”文字转换为可用于生成代码的数字的最佳方法是什么?我应该使用macro_rules!还是一个proc-macro

0 投票
1 回答
355 浏览

rust - 如何提供可选泛型作为 macro_rules 参数?

我想用它macro_rules来创建一个特征的实现。类型应该作为宏参数给出。但是,其中一些类型可能包含生命周期,所以我需要它们。我也有一个来自宏内部的泛型类型。结果应该看起来像

如何构建宏以及如何调用它?

0 投票
1 回答
833 浏览

rust - 如何处理或测试类型是否是 Rust 宏中的选项?

我正在尝试创建一个宏来生成一个可以从 postgres 数据库填充的结构。现在,由于数据库中有可以为空和不可为空的字段,我想在宏中以不同的方式处理它们。

输出应该是这样的结构:

这是当前的宏代码:

宏调用:

0 投票
1 回答
482 浏览

rust - 推断调用板条箱的名称以在程序宏中填充 doctest

我正在创建一个从某个配置文件自动生成库的程序宏(它是一个寄存器布局,但这对于这个问题并不重要)。

我希望该库自动生成自动库随附的文档,并包含应该使用cargo test. 现在,我已经实现了大部分,但有一个问题我看不到解决方案。

假设我们有一个调用的库my_lib,我们在其中调用宏来填充它:

扩展为:

这将按预期运行 -cargo doc将做正确的事情cargo test并按预期运行文档测试。

问题是,在这个例子中,use my_lib被硬编码到my_macro_lib这显然是不可取的。

如何创建一个宏来推断正在调用的 crate 的名称?

我尝试macro_rules!在程序宏内部使用 a expand $crate,但这违反了卫生规则。

0 投票
1 回答
536 浏览

rust - 如何匹配 Rust 宏中的特征?

我的目标是作为输入特征类型。

到目前为止,我尝试的是编写这样的解析器。

但它造成了当地的歧义。