问题标签 [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.
struct - 如何以编程方式获取结构的字段数?
我有一个自定义结构,如下所示:
是否可以通过编程方式获取结构字段的数量(例如,通过方法调用field_count()
):
对于这个结构:
...以下调用应返回1
:
是否有类似的 APIfield_count()
或者只能通过宏获得?
如果这可以通过宏实现,应该如何实现?
macros - 匹配封闭函数的返回类型
Rust 宏是否可以匹配封闭函数的返回类型?
一个示例类似于日志记录和断言宏,它也会在返回Err
的函数中返回Result
,而在未返回的函数中出现恐慌Result
。为了实现这一点,宏应该以某种方式知道封闭函数的返回类型。
我想这对于声明性宏 ( ) 是不可能的,macro_rules!
因为它们有一组有限的匹配类型(如Rust 参考,示例宏一章中所述):项目、块、语句、模式、表达式、类型、标识符等on,但不是封闭函数的返回类型。
但也许使用过程宏?
error-handling - 如何使用引用宏报告程序宏中的错误?
我正在编写一个运行良好的程序宏,但我无法以符合人体工程学的方式报告错误。使用panic!
“有效”但并不优雅,也不能很好地向用户显示错误消息。
我知道我可以在解析 a 时报告好的错误TokenStream
,但是在解析 AST 后我需要在遍历 AST 时产生错误。
宏调用如下所示:
并且应该输出:
这是宏代码:
bool
如果属性中没有指定任何内容,我想产生一个错误。例如,像这样输入:
应该导致类似:
在解析过程中,有 a Result
,其中包含很多有用的信息,包括 a span
,因此产生的错误可以突出显示有问题的宏调用的确切部分。但是一旦我遍历 AST,我就看不到报告错误的好方法。
这应该怎么做?
syntax - Rust 声明性宏中的 @ 符号是什么意思?
我见过@
宏中使用的符号,但我在 Rust Book 或任何官方文档或博客文章中都找不到它的提及。例如,在这个 Stack Overflow 答案中,它是这样使用的:
从用法来看,它似乎用于声明另一个宏是主宏的本地宏。
这个符号是什么意思,为什么要使用它而不是创建另一个顶级宏?
rust - 有没有办法在非夜间 Rust 上查看扩展宏?
我意识到之前有人问过这个问题,答案是使用-Z
with 选项rustc
,但这仅适用于 Rust 1.31 的夜间构建。
使用稳定版本时有其他选择吗?
rust - 在声明性宏中构建所有元素对(二次集)
我有一个标识符列表,我想为该列表中的每对标识符调用一个宏。例如,如果我有a
,b
和c
,我想生成这个:
当然,这是一个虚拟的例子。在我的真实代码中,标识符是类型,我想生成impl
块或类似的东西。
我的目标是只列出每个标识符一次。在我的真实代码中,我有大约 12 个标识符并且不想手动写下所有 12² = 144 对。所以我认为宏可能会帮助我。我知道它可以用所有强大的过程宏来解决,但我希望它也可以用声明性宏(macro_rules!
)来解决。
我尝试了我认为是处理这个问题的直观方法(两个嵌套的“循环”)(Playground):
但是,这会导致此错误:
我想这是有道理的,所以我尝试了其他东西(Playground):
但这会导致与上述相同的错误!
这完全可以使用声明性宏吗?
rust - 宏中的元组索引
我正在尝试在为特征实现生成签名的宏中索引数据元组,但有一些错误。我可以索引元组还是需要其他解决方案?破解tuple_index
我在谷歌找到的,但它对我不起作用。
编译错误:
rust - 如何禁用“不必要的路径消歧器”警告?
我正在使用宏生成代码,其中包含完全限定的类型路径,如下所示:
::
注意前面的多余<String>
。这是必要的,因此相同的输入标记也可以用于构造函数,方法是附加::new()
:
但是,这会产生警告:
我无法删除,::
因为我收到一个错误:
如何仅针对这一行禁用警告?
rust - 如何在类型上而不是在类型内部使用自定义命名空间派生宏属性?
我想创建一个使用新命名空间属性语法的自定义派生宏:example::attr
. 我已经能够让它与类型内的属性一起工作(例如,在结构字段或枚举变体上),但不适用于类型本身。
src/main.rs
过程宏本身什么也不做,除了声明它example::attr
是一个有效的属性。
复制衍生/src/lib.rs
编译产量:
切换到属性 ( ) 的非命名空间形式example_attr
可以正常工作。
我正在使用 Rust 1.32.0。项目布局为
货运.toml
repro-derive/Cargo.toml