问题标签 [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.
rust - 为什么要格式化!不能在return语句中使用?
这编译:
这不
对于非工作示例,我收到以下错误:
当宏在 return 语句中时,是否会发生一些隐含的事情?
compiler-errors - 在编译时发出警告?
我想在编译时发出警告,可能来自宏。它不应该被 静音cap_lints
。我当前的用例是功能弃用,但还有其他可能的用途。
rust - 在 macro_rules 中存储状态
我想创建一个对给定类型列表进行操作的宏,但我需要能够存储正在处理的其他类型。
我想做的一个简单的例子:
问题是它似乎macro_rules
不允许我存储临时状态(即HashSet
,我将标记哪些类型是宏调用的一部分)。我想到的唯一解决方法是编写我想要的内容proc_macro_derive
并为我需要的每种类型手动添加自定义属性,但这显然远非完美......
编辑:
这个问题类似于这个问题,但在这里我试图在一个宏调用中本地和临时保存一个状态(基本上在存储有关这些参数的数据时对参数进行两次传递)。然而,这似乎也是不可能的。
rust - 锈打印!问题 - println 宏内部的奇怪行为
我目前正在开发一个简单的“用户输入”程序。用户可以输入一个数字,我用
std::io::stdin().read_line(&mut let_name_here).ok().expect("Error");
. 获得用户输入后,我想将其打印到控制台以供查看。
我注意到 println! 中的奇怪行为!宏。以下代码
输出这个:
为什么marco中有多余\n
的东西。println!
根据我的编码经验,我会假设以下内容:
但要实现此输出,我必须使用以下代码:
我不明白为什么println!
marco 输出\n
两次。我会怎么做,如果我想\n
在第一行的末尾,用这两个马科斯是不可能的。我错过了什么重要的东西吗?
rust - 使用不同“种类”元素构建枚举的宏
我正在尝试提出一个我称之为宏的宏
它将创建一个枚举来表示状态机状态,其中一些将是最终(接受)状态 - S2
, S3
. 生成的枚举及其impl
应如下所示:
我天真的尝试:
最终出现以下错误:
尝试删除第二行中模式之间的逗号:
正在生产另一个:
我想我了解导致这些错误的原因 - 它认为这final
是另一个标识符匹配r
。但是编写这样一个宏的正确方法是什么(如果可能的话,不会过于复杂)?
我对宏调用有充分的灵活性,因为这是我个人的学习练习。主要目标是学习正确的做事方式。如果可能的话,最好让这个宏final
在任何位置接受。
rust - 计算并生成重复结构字段的 Rust 宏
我想编写一个从整数参数生成不同结构的宏。例如,make_struct!(3)
可能会生成如下内容:
将“3”文字转换为可用于生成代码的数字的最佳方法是什么?我应该使用macro_rules!
还是一个proc-macro
?
rust - 如何提供可选泛型作为 macro_rules 参数?
我想用它macro_rules
来创建一个特征的实现。类型应该作为宏参数给出。但是,其中一些类型可能包含生命周期,所以我需要它们。我也有一个来自宏内部的泛型类型。结果应该看起来像
如何构建宏以及如何调用它?
rust - 如何处理或测试类型是否是 Rust 宏中的选项?
我正在尝试创建一个宏来生成一个可以从 postgres 数据库填充的结构。现在,由于数据库中有可以为空和不可为空的字段,我想在宏中以不同的方式处理它们。
输出应该是这样的结构:
这是当前的宏代码:
宏调用:
rust - 推断调用板条箱的名称以在程序宏中填充 doctest
我正在创建一个从某个配置文件自动生成库的程序宏(它是一个寄存器布局,但这对于这个问题并不重要)。
我希望该库自动生成自动库随附的文档,并包含应该使用cargo test
. 现在,我已经实现了大部分,但有一个问题我看不到解决方案。
假设我们有一个调用的库my_lib
,我们在其中调用宏来填充它:
扩展为:
这将按预期运行 -cargo doc
将做正确的事情cargo test
并按预期运行文档测试。
问题是,在这个例子中,use my_lib
被硬编码到my_macro_lib
这显然是不可取的。
如何创建一个宏来推断正在调用的 crate 的名称?
我尝试macro_rules!
在程序宏内部使用 a expand $crate
,但这违反了卫生规则。
rust - 如何匹配 Rust 宏中的特征?
我的目标是作为输入特征类型。
到目前为止,我尝试的是编写这样的解析器。
但它造成了当地的歧义。