问题标签 [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 回答
315 浏览

rust - 包装任意数量类型的宏

是否可以编写一个宏来定义一个包含任意数量(不同)输入类型的枚举?我想做一种类型级别的匹配。

这将扩展为:

这样我就可以像这样写

0 投票
1 回答
1629 浏览

macros - 为什么我不能访问在宏中声明的变量,除非我传入变量的名称?

我有这个宏:

这扩展了这个调用:

进入我的期望(来自--pretty=expanded):

在随后的代码中,我可以打印x, y, 并且z很好,但outer似乎未定义:

outer如果我将它作为显式宏参数传递,我可以访问该变量。

这是故意的,与“宏观卫生”有关吗?如果是这样,那么--pretty=expanded以某种特殊方式标记这些“内部”变量可能有意义吗?

0 投票
1 回答
1155 浏览

macros - 我可以通过宏中的多个规则重复匹配吗?

我可以在 Rust 宏中重复匹配吗?我希望能够做类似的事情:

基本上,任意数量的分号分隔语句,并且每个语句由不同的规则处理。

我知道我可以有几个foo!(),bar!()宏 - 每个语句,但理想情况下我想避免这种情况。

我在想是否可以捕获类似$($t:tt)*, 但不包括分号的内容,然后委托给其他宏?

0 投票
1 回答
858 浏览

macros - Rust 宏:如何创建派生标识符?

对于标识符,我可以使用 ident 类型的现有标记,或者创建一个固定/文字标识符。但是如何创建一个“派生的”标识符呢?意思是,有一个现有的令牌 $id,我想创建一些派生标识符,如 $id_suffix - 确切的名称并不重要,真的 - 只要它是一个新的,并且确定地从 $id 派生。

0 投票
1 回答
7754 浏览

struct - 如何制作一个所有字段都是公共的公共结构而不为每个字段重复“pub”?

如何在 Rust 中定义一个公共结构,其中所有字段都是公共的,而不必pub在每个字段前面重复修饰符?

pub_struct宏将是理想的:

这相当于:

0 投票
1 回答
493 浏览

rust - 匹配文档注释的宏规则

有没有办法匹配 Rust 中的文档注释macro_rules

我有一个宏,它为一堆 C 常量生成一个枚举,这些常量bindgen创建:

我想用文档注释(///注释)注释每个,但这要求我的宏与文档注释匹配。那可能吗?

0 投票
1 回答
715 浏览

rust - 如何在 Rust 过程宏中获取 impl 块的类型?

我正在尝试编写一个可以应用于这样的 impl 块的 Rust 过程宏;

我正在使用 syn 和 quote 来解析和格式化TokenStream宏中的 s。它看起来像这样:

有没有办法使用 syn 访问 impl 块的类型名称?我没有看到任何ItemImpl可以为我提供该信息的字段。

0 投票
1 回答
1271 浏览

rust - 实现 proc 宏时的循环包依赖

我尝试实现一个类似于 serdes 的Dumpproc_macro Serialize

为此,我有一个板条箱foo,其中包含我的“原始”结构(P1P2这种情况下),它应该只能是可转储的。

接下来我确实有一个foo_derive包含程序宏本身的板条箱。

因为我想支持多种格式,所以我有第三个板条箱foo_dump,其中包含Dump(例如,可以转储此结构)和Dumper(这是后端应该实现的东西)的特征定义。非常直截了当,直到这一点。

当我现在想编译它时,我得到了这个错误:

我不知道正确的方法是什么,如何在这个 crate 中使用依赖项。我现在的一个是:

依赖关系

这当然是不可能的。

我错过了什么?我该怎么做才能打破依赖圈?


( mcve@github )

/货物.toml

/foo/Cargo.toml

/foo/src/lib.rs

/foo_dump/Cargo.toml

/foo_dump/src/lib.rs

/foo_derive/Cargo.toml

/foo_derive/src/lib.rs

0 投票
1 回答
3193 浏览

rust - 将字符串转换为 TokenStream

给定一个字符串 ( str),如何TokenStream在 Rust 中将其转换为 a?

我试过使用quote!宏。

这里的目标是为一些未知的代码字符串生成令牌。

或者

0 投票
1 回答
1188 浏览

rust - 无法调用类似函数的过程宏:无法扩展为语句

我试图让我的头脑围绕类似函数的过程宏并努力学习基础知识。

首先,我尝试创建一个只打印所有标记并且什么都不做的宏:

然后我尝试在另一个二进制文件中使用它:

当我这样做时,cargo build我得到了这个:

它告诉我这无法编译,但println在宏内部有效。怎么了?

问题 #54727非常广泛,我不确定它与此有何关系。

我正在使用 stable-i686-pc-windows-gnu、rustc 1.31.1 (b6c32da9b 2018-12-18)。