- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个对给定类型列表进行操作的宏,但我需要能够存储正在处理的其他类型。
我想做的事情的一个简单例子:
struct Foo;
struct Bar {
foo: Foo,
data: u32,
}
baz!(Foo, Bar);
// outputs
struct OptFoo;
struct OptBar {
foo: OptFoo,
data: u32
}
问题是 macro_rules
似乎不允许我存储临时状态(即 HashSet
,我会在其中标记哪些类型是宏的一部分调用)。我想到的唯一解决方法是将我想要的内容编写为 proc_macro_derive
并为我需要的每种类型手动添加自定义属性,但这显然远非完美......
编辑:
问题类似于this one ,但在这里我试图在单个宏调用中临时保存一个状态(基本上是在存储有关参数的同时对参数进行两次传递)。然而,这似乎也是不可能的。
最佳答案
正如@trentcl 所指出的,我想要实现的目标确实可以通过 proc 宏实现(我认为 proc 宏仅限于 Derive
和属性...)
#[proc_macro]
pub fn generate(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = proc_macro2::TokenStream::from(input);
println!("{:?}", input);
proc_macro::TokenStream::from(input)
}
generate!(struct Foo;);
// outputs its argument without changing anything, i.e:
// struct Foo ;
前面的示例演示了一个简单的宏,它打印到 sdout 已解析的输入:TokenStream [Ident { ident: "struct", span: #0 bytes(330..336) }, Ident { ident: "Foo ", span: #0 bytes(337..340) }, Punct { ch: ';', spacing: Alone, span: #0 bytes(340..341) }]
请注意,它会解析标记但不会创建 AST;为此,我们必须使用 syn
。
This repo有许多可以使用 proc 宏完成的示例,非常有帮助!
关于rust - 在 macro_rules 中存储状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57135615/
我正在尝试理解 rust 宏语法。 Here我读到宏通常可以以 3 种方式调用: mymacro!(); mymacro![]; mymacro!{}; ...然后我看到一个示例宏定义也使用宏( ma
我正在尝试制作一个宏,让我遍历类型列表以减少 trait impl 样板。 (我目前正在使用不同的基于宏的解决方案,但如果不添加依赖项可能的话,这似乎更具可读性。) 这是我的目标语法: trait M
我正在创建一个名为 throw_error 的宏。我希望它能编译,但它失败了: // Util structs + types ... // Util macros #[macro_export] m
这个问题在这里已经有了答案: How do I create a Rust macro with optional parameters using repetitions? (1 个回答) Is
我想创建一个对给定类型列表进行操作的宏,但我需要能够存储正在处理的其他类型。 我想做的事情的一个简单例子: struct Foo; struct Bar { foo: Foo, data:
我想使用 macro_rules 来创建一个特征的实现。类型应作为宏参数给出。但是,其中一些类型可能包含生命周期,所以我需要它们。我还有一个来自宏内部的泛型类型。结果应该是这样的 impl Foo f
我正在编写一个宏来方便地匹配 enum 中的嵌套结构类型变量到编译时模板。这个想法是利用 Rust 的模式匹配在结构的某些位置强制执行特定值,或将变量绑定(bind)到其他有趣的位置。基本思想在我的实
如何为这样的宏转义美元符号? macro_rules! test { ($ $name:ident) => { println!(stringify!($name));
我正在尝试在宏中创建生命周期通用的函数。外面没有什么花哨的,只是一个硬编码的局部函数: macro_rules! generate_parse_function { ($rule_name:i
我在理解Rust的tt宏中究竟是什么macro_rules!时遇到了麻烦。 从this answer,我以为 tt will match any single token or any pair of
在 L 系统表示法中,模式看起来像这样: A(a)B(b, c) if a+b+c B(a+b, a+c)A(x+a+b+c) 我正在尝试编写 Rust 宏来扩展它们。所以我有这样的东西: macr
这个问题在这里已经有了答案: What does "expected type `()`" mean on a match expression? (1 个回答) 关闭 3 年前。 我正在浏览 Ru
在 macro_rules 中!您可以在冒号后声明要解析的不同类型的东西(例如标识符的 $x:ident 或类型的 $y:ty ),但是我对如何声明我想捕获一生感到困惑,像 'a 或 '静态的。现在这
考虑以下代码段: macro_rules! quick_hello { ($to_print:expr) => { { let h = "hello";
我正在编写我自己的语言编译器,我想用我的宏将 AST 描述为 S 表达式。 以下是不起作用的最小示例代码。 #[derive(Debug, PartialEq)] pub enum Expressio
我正在尝试定义宏以简化枚举的创建可以转换为 str 或从 str 转换为: macro_rules! define_enum_with_str_values { ($Name:ident {
玩具示例: macro_rules! boo { ($T:ident) => { let x: $T; }; } fn main() { boo!(i32);
有没有办法“重新导出”#[macro_use] extern crate 类似于 pub use 这样使用宏的宏用户就不必手动添加这些依赖的 extern crate 吗? 问题的其余部分是一个例子来
Playground link 我将几个不同的结构归为一个枚举: pub enum Ty { A(AStruct), B(BStruct) } pub struct AStruct {
我是一名优秀的程序员,十分优秀!