问题标签 [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 - 包装任意数量类型的宏
是否可以编写一个宏来定义一个包含任意数量(不同)输入类型的枚举?我想做一种类型级别的匹配。
这将扩展为:
这样我就可以像这样写
macros - 为什么我不能访问在宏中声明的变量,除非我传入变量的名称?
我有这个宏:
这扩展了这个调用:
进入我的期望(来自--pretty=expanded
):
在随后的代码中,我可以打印x
, y
, 并且z
很好,但outer
似乎未定义:
outer
如果我将它作为显式宏参数传递,我可以访问该变量。
这是故意的,与“宏观卫生”有关吗?如果是这样,那么--pretty=expanded
以某种特殊方式标记这些“内部”变量可能有意义吗?
macros - 我可以通过宏中的多个规则重复匹配吗?
我可以在 Rust 宏中重复匹配吗?我希望能够做类似的事情:
基本上,任意数量的分号分隔语句,并且每个语句由不同的规则处理。
我知道我可以有几个foo!()
,bar!()
宏 - 每个语句,但理想情况下我想避免这种情况。
我在想是否可以捕获类似$($t:tt)*,
但不包括分号的内容,然后委托给其他宏?
macros - Rust 宏:如何创建派生标识符?
对于标识符,我可以使用 ident 类型的现有标记,或者创建一个固定/文字标识符。但是如何创建一个“派生的”标识符呢?意思是,有一个现有的令牌 $id,我想创建一些派生标识符,如 $id_suffix - 确切的名称并不重要,真的 - 只要它是一个新的,并且确定地从 $id 派生。
struct - 如何制作一个所有字段都是公共的公共结构而不为每个字段重复“pub”?
如何在 Rust 中定义一个公共结构,其中所有字段都是公共的,而不必pub
在每个字段前面重复修饰符?
pub_struct
宏将是理想的:
这相当于:
rust - 匹配文档注释的宏规则
有没有办法匹配 Rust 中的文档注释macro_rules
?
我有一个宏,它为一堆 C 常量生成一个枚举,这些常量bindgen
创建:
我想用文档注释(///
注释)注释每个,但这要求我的宏与文档注释匹配。那可能吗?
rust - 如何在 Rust 过程宏中获取 impl 块的类型?
我正在尝试编写一个可以应用于这样的 impl 块的 Rust 过程宏;
我正在使用 syn 和 quote 来解析和格式化TokenStream
宏中的 s。它看起来像这样:
有没有办法使用 syn 访问 impl 块的类型名称?我没有看到任何ItemImpl
可以为我提供该信息的字段。
rust - 实现 proc 宏时的循环包依赖
我尝试实现一个类似于 serdes 的Dump
proc_macro Serialize
。
为此,我有一个板条箱foo
,其中包含我的“原始”结构(P1
在P2
这种情况下),它应该只能是可转储的。
接下来我确实有一个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
rust - 将字符串转换为 TokenStream
给定一个字符串 ( str
),如何TokenStream
在 Rust 中将其转换为 a?
我试过使用quote!
宏。
这里的目标是为一些未知的代码字符串生成令牌。
或者
rust - 无法调用类似函数的过程宏:无法扩展为语句
我试图让我的头脑围绕类似函数的过程宏并努力学习基础知识。
首先,我尝试创建一个只打印所有标记并且什么都不做的宏:
然后我尝试在另一个二进制文件中使用它:
当我这样做时,cargo build
我得到了这个:
它告诉我这无法编译,但println
在宏内部有效。怎么了?
问题 #54727非常广泛,我不确定它与此有何关系。
我正在使用 stable-i686-pc-windows-gnu、rustc 1.31.1 (b6c32da9b 2018-12-18)。